用c语言栈实现无括号表达式求值
时间: 2023-05-15 19:07:51 浏览: 127
可以使用逆波兰表达式来实现无括号表达式求值,具体实现可以使用栈来辅助计算。首先将表达式转换为逆波兰表达式,然后遍历逆波兰表达式,遇到数字则入栈,遇到运算符则弹出栈顶两个元素进行计算,将结果再次入栈,最终栈中只剩下一个元素,即为表达式的值。以下是示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define STACK_SIZE 100
typedef struct {
int top;
int data[STACK_SIZE];
} Stack;
void push(Stack *s, int value) {
if (s->top == STACK_SIZE) {
fprintf(stderr, "Stack overflow\n");
exit(EXIT_FAILURE);
}
s->data[s->top++] = value;
}
int pop(Stack *s) {
if (s->top == 0) {
fprintf(stderr, "Stack underflow\n");
exit(EXIT_FAILURE);
}
return s->data[--s->top];
}
int evaluate(char *expr) {
Stack s;
s.top = 0;
int i = 0;
while (expr[i] != '\0') {
if (isdigit(expr[i])) {
int num = 0;
while (isdigit(expr[i])) {
num = num * 10 + (expr[i] - '0');
i++;
}
push(&s, num);
} else if (expr[i] == '+' || expr[i] == '-' || expr[i] == '*' || expr[i] == '/') {
int b = pop(&s);
int a = pop(&s);
int result;
switch (expr[i]) {
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '*':
result = a * b;
break;
case '/':
result = a / b;
break;
}
push(&s, result);
i++;
} else {
i++;
}
}
return pop(&s);
}
int main() {
char expr[] = "3 4 + 5 *";
int result = evaluate(expr);
printf("%d\n", result); // expected output: 35
return 0;
}
```
注意:这里的表达式是逆波兰表达式,每个数字和运算符之间用空格分隔。如果要处理中缀表达式,需要先将中缀表达式转换为后缀表达式(逆波兰表达式),然后再进行求值。