C语言输入一个中缀表达式,表达式中有+、-、*、/四种运算以及(、),表达式中的其他符号为大写的字母。实现一个算法,得到相应的后缀表达式。
时间: 2023-05-30 19:04:29 浏览: 499
算术表达式C算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为简化,规定操作数只能为正整数,操作符为+、-*、/,用#表示结束。
5星 · 资源好评率100%
解法:
1. 创建一个栈,用来存储运算符。
2. 从左到右遍历中缀表达式的每个元素。
3. 如果当前元素是数字或字母,直接将其添加到后缀表达式中。
4. 如果当前元素是左括号,将其压入栈中。
5. 如果当前元素是右括号,将栈中的元素弹出并加入到后缀表达式中,直到遇到左括号,将左括号弹出丢弃。
6. 如果当前元素是运算符,将其与栈顶的元素比较,如果栈顶元素优先级高于当前元素,将栈顶元素弹出并加入到后缀表达式中,重复步骤6直到栈顶元素优先级低于或等于当前元素,然后将当前元素压入栈中。
7. 遍历完整个中缀表达式后,将栈中剩余的元素依次弹出并加入到后缀表达式中。
示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_EXPR_LEN 100
typedef struct stack {
char data[MAX_EXPR_LEN];
int top;
} Stack;
void push(Stack *s, char c) {
if (s->top < MAX_EXPR_LEN) {
s->data[s->top++] = c;
} else {
printf("Stack overflow!\n");
exit(1);
}
}
char pop(Stack *s) {
if (s->top > 0) {
return s->data[--s->top];
} else {
printf("Stack underflow!\n");
exit(1);
}
}
char peek(Stack *s) {
if (s->top > 0) {
return s->data[s->top - 1];
} else {
printf("Stack is empty!\n");
exit(1);
}
}
int is_operator(char c) {
return (c == '+' || c == '-' || c == '*' || c == '/');
}
int operator_priority(char c) {
if (c == '*' || c == '/') {
return 2;
} else if (c == '+' || c == '-') {
return 1;
} else {
return 0;
}
}
void infix_to_postfix(char *infix, char *postfix) {
Stack s;
s.top = 0;
int len = strlen(infix);
int i;
for (i = 0; i < len; i++) {
char c = infix[i];
if (c >= 'A' && c <= 'Z') {
postfix[strlen(postfix)] = c;
} else if (c == '(') {
push(&s, c);
} else if (c == ')') {
while (peek(&s) != '(') {
postfix[strlen(postfix)] = pop(&s);
}
pop(&s);
} else if (is_operator(c)) {
while (s.top > 0 && is_operator(peek(&s)) && operator_priority(peek(&s)) >= operator_priority(c)) {
postfix[strlen(postfix)] = pop(&s);
}
push(&s, c);
}
}
while (s.top > 0) {
postfix[strlen(postfix)] = pop(&s);
}
}
int main() {
char infix[MAX_EXPR_LEN], postfix[MAX_EXPR_LEN];
printf("Enter an infix expression: ");
fgets(infix, MAX_EXPR_LEN, stdin);
infix_to_postfix(infix, postfix);
printf("The postfix expression is: %s\n", postfix);
return 0;
}
```
阅读全文