c++ 表达式求值 代码
时间: 2023-09-09 07:12:14 浏览: 44
这是一个比较复杂的问题,因为表达式求值涉及到很多细节和边界情况。下面是一个简单的实现,使用栈来辅助求解:
```c
#include <stdio.h>
#include <stdlib.h>
#define STACK_SIZE 100
typedef struct {
int top;
int stack[STACK_SIZE];
} Stack;
void push(Stack *s, int value) {
if (s->top < STACK_SIZE) {
s->stack[s->top++] = value;
} else {
printf("Stack overflow\n");
exit(1);
}
}
int pop(Stack *s) {
if (s->top > 0) {
return s->stack[--s->top];
} else {
printf("Stack underflow\n");
exit(1);
}
}
int is_empty(Stack *s) {
return s->top == 0;
}
int is_operator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
int is_digit(char c) {
return c >= '0' && c <= '9';
}
int evaluate(char *expr) {
Stack s;
s.top = 0;
int i = 0;
while (expr[i] != '\0') {
if (is_space(expr[i])) {
// skip whitespace
i++;
} else if (is_digit(expr[i])) {
// parse number
int value = 0;
while (is_digit(expr[i])) {
value = value * 10 + (expr[i] - '0');
i++;
}
push(&s, value);
} else if (is_operator(expr[i])) {
// apply operator
int b = pop(&s);
int a = pop(&s);
switch (expr[i]) {
case '+':
push(&s, a + b);
break;
case '-':
push(&s, a - b);
break;
case '*':
push(&s, a * b);
break;
case '/':
push(&s, a / b);
break;
}
i++;
} else {
printf("Invalid character: %c\n", expr[i]);
exit(1);
}
}
if (is_empty(&s)) {
printf("Empty stack\n");
exit(1);
}
return pop(&s);
}
int main() {
char expr[] = " 1 + 2 * 3 - 4 / 5 ";
int result = evaluate(expr);
printf("Result: %d\n", result);
return 0;
}
```
这个实现假设输入的表达式是合法的,并且不包含括号。如果需要处理括号,还需要进行更多的工作。