基于栈的后缀表达式求值C语言严蔚敏
时间: 2024-10-11 18:12:37 浏览: 31
严蔚敏《数据结构》实验二:基于栈的中缀算数表达式求值
基于栈的后缀表达式(Reverse Polish Notation,RPN)求值是一种利用栈数据结构来计算数学表达式的方法,尤其是在处理没有括号的简单表达式时非常有效。严蔚敏版的C语言实现通常涉及以下几个步骤:
1. **输入解析**:首先读取输入的后缀表达式的字符串,如 "2 3 + 4 *"。
2. **初始化栈**:创建一个空的整数栈来存储操作数。
3. **遍历后缀表达式**:对于每个字符,检查它是否是一个数字,如果是,则压入栈;如果不是数字,那么它是一个运算符。如果是运算符,会弹出栈顶两个元素(操作数),然后根据运算符优先级进行计算,并将结果压回栈中。
4. **计算结束**:当遇到最后一个字符并判断不是运算符时,这意味着剩余的是一个未完成的操作数,需要将其直接压入栈。
5. **结果获取**:最后栈中剩下的就是计算结果,因为栈顶元素是最终的计算结果。
以下是简化版的C语言代码片段:
```c
#include <stdio.h>
#include <stdlib.h>
int evalPostfix(char* postfix) {
int stack[100], top = -1;
char ch;
while (postfix != NULL) {
ch = postfix[0];
postfix++; // 移动指针
if (isdigit(ch)) { // 数字
int num = 0;
while (isdigit(ch)) {
num = num * 10 + ch - '0';
ch = postfix[0];
postfix++;
}
stack[++top] = num;
} else { // 运算符
int op2 = stack[top--]; // 弹出栈顶元素
int op1 = stack[top--]; // 再次弹出栈顶元素
switch (ch) {
case '+':
stack[top++] = op1 + op2;
break;
case '-':
stack[top++] = op1 - op2;
break;
case '*':
stack[top++] = op1 * op2;
break;
case '/':
if (op2 != 0)
stack[top++] = op1 / op2;
else
printf("Error: Division by zero\n");
break;
}
}
}
return stack[0];
}
int main() {
char postfix[] = "2 3 + 4 *";
printf("Result: %d\n", evalPostfix(postfix));
return 0;
}
```
阅读全文