c++前缀表达式求值
时间: 2024-08-03 14:01:43 浏览: 54
前缀表达式也称为逆波兰表示法(Reverse Polish Notation,RPN),在C++中计算这类表达式的求值通常涉及到两个步骤:解析输入字符串并构建操作数堆栈,然后按照RPN规则依次取出操作数和运算符进行计算。
1. 解析:首先,你需要遍历输入的前缀表达式字符串,遇到数字就压入堆栈,遇到运算符则从堆栈弹出足够的元素来进行运算。例如,遇到`+`运算符,会先弹出两个操作数做加法,再将结果压回堆栈。
2. 计算:对于每个运算符,你根据其优先级和操作数的数量执行相应的操作。例如,`*`和 `/` 比 `+` 和 `-` 的优先级高,所以当遇到`*` 或 `/` 时,需要先处理它。同时,如果遇到左括号`(`,应该将其压入堆栈,遇到右括号`)`则需要弹出匹配的左括号,并计算括号内的部分。
以下是简单的示例代码片段:
```cpp
#include <stack>
#include <string>
int evalPrefix(std::string exp) {
std::stack<int> stack;
for (char c : exp) {
if (isdigit(c)) { // 如果是数字
int num = 0;
while (isdigit(c)) {
num = num * 10 + (c - '0');
++c; // 遍历字符
}
stack.push(num);
} else if (c == '+' || c == '-' || c == '*' || c == '/') { // 如果是运算符
int b = stack.top(); stack.pop();
int a = stack.top(); stack.pop();
switch (c) {
case '+': stack.push(a + b); break;
case '-': stack.push(a - b); break;
case '*': stack.push(a * b); break;
case '/': stack.push(a / b); break;
}
} else if (c == '(') { // 左括号
stack.push(c);
} else if (c == ')') { // 右括号
while (!stack.empty() && stack.top() != '(') {
char op = stack.top();
stack.pop();
int b = stack.top(); stack.pop();
int a = stack.top(); stack.pop();
switch (op) {
// 处理非空栈的情况
}
}
stack.pop(); // 弹出左括号
}
}
return stack.top(); // 返回最后的结果
}
阅读全文