怎么用数据结构来完成表达式求值,用c语言写出代码
时间: 2024-10-25 20:16:32 浏览: 14
表达式求值通常可以使用栈(Stack)的数据结构来辅助计算,因为栈的特性正好符合运算符优先级和左结合规则。以下是一个简单的C语言代码示例,用于递归地处理中缀表达式(如 `2 + 3 * 4`):
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char op; // 运算符
int val; // 整数值
} Token;
// 比较运算符的优先级
int precedence(char op) {
if (op == '+' || op == '-') return 1;
else if (op == '*' || op == '/') return 2;
return 0;
}
// 计算两个操作数并返回结果
int applyOp(int a, int b, char op) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
default: return INT_MIN; // 非法运算符
}
}
// 中缀表达式的求值函数
int evaluate(char* exp) {
Token stack[100];
int top = -1;
int num = 0;
int i;
for (i = 0; exp[i] != '\0'; i++) {
if (isdigit(exp[i])) { // 如果遇到数字字符
num = num * 10 + (exp[i] - '0'); // 追加到当前数字
} else if (exp[i] == '(') { // 开始一个新的表达式
stack[++top].val = num;
stack[top].op = '(';
num = 0;
} else if (exp[i] == ')') { // 结束一个表达式
stack[++top].val = num;
top--; // 出栈
while (stack[top].op != '(' && precedence(stack[top].op) >= precedence(exp[i])) {
num = applyOp(num, stack[top].val, stack[top].op);
top--;
}
stack[top].val = num;
} else { // 遇到运算符
while (top > 0 && precedence(stack[top].op) >= precedence(exp[i])) {
num = applyOp(stack[top].val, num, stack[top].op);
top--;
}
stack[++top].op = exp[i];
}
}
// 处理最后剩余的运算符
while (top > 0) {
num = applyOp(stack[top].val, num, stack[top].op);
top--;
}
return num;
}
int main() {
char expr[] = "2 + 3 * 4";
printf("表达式 %s 的值为:%d\n", expr, evaluate(expr));
return 0;
}
```
这个程序首先初始化一个栈,并遍历输入的中缀表达式。遇到数字时将其累积,遇到左括号入栈;遇到右括号时出栈直到找到左括号或者当前运算符优先级低于右括号;遇到运算符则不断出栈直至找到当前运算符优先级最低的运算符,然后将当前运算符压入栈。遍历结束后,栈顶剩下的就是最终结果。
阅读全文