中缀表达式求值 不考虑括号 c++
时间: 2024-10-23 15:11:23 浏览: 11
中缀表达式求值(也称为前缀或后缀表示法之外的直接计算)通常涉及到将数学表达式从传统的中缀形式(如`a + b * c`)转换成逆波兰记法(也叫后缀表示法,即`abc+*`),然后按照特定规则逐个操作。在C++中,如果你需要处理非括号的中缀表达式,你可以采用递归算法或栈来解决。
基本步骤如下:
1. 初始化一个空栈和一个结果变量。
2. 遍历输入的中缀表达式的每个字符。
- 如果遇到数字,就将其压入栈中。
- 如果遇到运算符,弹出栈顶的两个操作数(直到遇到左括号或遇到比当前运算符优先级低的运算符为止),计算它们的结果,然后将结果和当前运算符一起压回栈中。
3. 当遍历完所有字符,栈里剩下的元素就是操作数,通过连续进行栈顶运算得到最终结果。
```cpp
#include <stack>
#include <string>
int precedence(char op) {
// 这里简单地定义运算符优先级,可以根据实际需求调整
if (op == '+' || op == '-') return 1;
if (op == '*' || op == '/') return 2;
return 0;
}
int evaluateInfix(const std::string& infix) {
std::stack<int> values; // 存储数值
int i = 0;
for (; i < infix.length(); ++i) {
if (isdigit(infix[i])) {
int num = 0;
while (i < infix.length() && isdigit(infix[i])) {
num = num * 10 + (infix[i] - '0');
++i;
}
values.push(num);
} else {
int val2 = values.top(); values.pop();
int val1 = values.top(); values.pop();
int result;
switch (infix[i]) {
case '+': result = val1 + val2; break;
case '-': result = val1 - val2; break;
case '*': result = val1 * val2; break;
case '/': result = val1 / val2; break;
default: assert(false); // 未处理的运算符
}
values.push(result);
}
}
return values.top();
}
阅读全文