栈实现表达式求值c++
时间: 2024-10-17 16:05:57 浏览: 54
栈实现表达式求值在C++中通常用于解析逆波兰表示法(Reverse Polish Notation,RPN),也称为后缀表示法。这种方法避免了复杂的括号处理,计算过程相对简单。以下是基本步骤:
1. **输入表达式**:将中缀表达式转换成后缀表达式的字符串。
2. **创建栈**:初始化一个空栈,用于存储操作数。
3. **遍历后缀表达式**:
- 遇到数字,直接压入栈。
- 遇到运算符,从栈顶取出两个操作数,根据运算符执行相应操作,结果替换掉栈顶的操作数,然后继续处理下一个运算符。
4. **处理完整表达式**:如果只剩下一个元素在栈中,它就是最终结果。如果有剩余的元素,说明输入有误,因为后缀表达式不应该有任何未匹配的运算符。
5. **计算求值**:对栈中的元素(现在都是操作数),按照剩余的运算符依次执行加减乘除等操作。
6. **返回结果**:最后栈中的唯一元素即为表达式的求值结果。
```cpp
#include <stack>
#include <string>
#include <sstream>
int evalPostfix(const std::string& expression) {
std::stack<int> stack;
std::istringstream iss(expression);
char op;
while (iss >> op) {
if (isdigit(op)) {
// 如果遇到数字,直接压入栈
stack.push(op - '0');
} else {
// 如果遇到运算符,弹出两个操作数进行计算
int b = stack.top(); stack.pop();
int a = stack.top(); stack.pop();
switch (op) {
case '+': stack.push(a + b); break;
case '-': stack.push(a - b); break;
case '*': stack.push(a * b); break;
case '/':
if (b != 0)
stack.push(a / b);
else
throw "Division by zero error"; // 或者抛异常处理错误情况
break;
default:
throw "Invalid operator"; // 或者抛异常处理未知运算符
}
}
}
return stack.top();
}
阅读全文