基于栈的中缀表达式求值Cpp代码
时间: 2024-10-12 11:16:39 浏览: 36
在C++中,基于栈的中缀表达式求值通常涉及到两个步骤:首先将中缀表达式转换成后缀(也称逆波兰记法),然后按照后缀表达式的规则使用栈来计算结果。
下面是一个简单的基于栈的中缀表达式求值的C++代码示例:
```cpp
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int isOperator(char op) {
if (op == '+' || op == '-' || op == '*' || op == '/') return true;
return false;
}
int precedence(char op) {
if (op == '+' || op == '-') return 1;
if (op == '*' || op == '/') return 2;
return 0;
}
int evaluate(string tokens) {
stack<int> values; // 栈用于存储操作数
stack<char> ops; // 栈用于存储运算符
for (char token : tokens) {
if (isdigit(token)) { // 如果是数字,直接入栈
int num = 0;
while (isdigit(token)) {
num = num * 10 + (token - '0');
token++;
}
values.push(num);
} else if (isOperator(token)) { // 如果是运算符
while (!ops.empty() && !isOperator(ops.top()) && precedence(ops.top()) >= precedence(token)) {
values.push(applyOp(values.pop(), values.pop(), ops.pop()));
}
ops.push(token); // 将运算符压入栈
} else if (token == '(') { // 处理左括号
ops.push(token);
} else if (token == ')') { // 处理右括号
while (!ops.top() || ops.top() != '(') {
values.push(applyOp(values.pop(), values.pop(), ops.pop()));
}
ops.pop(); // 弹出左括号
}
}
// 处理剩余的运算符和操作数
while (!ops.empty()) {
values.push(applyOp(values.pop(), values.pop(), ops.pop()));
}
return values.top();
}
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: assert(false); // 非法运算符
}
}
int main() {
string exp = "2+3*4"; // 测试表达式
cout << "Result of expression: " << evaluate(exp) << endl;
return 0;
}
```
在这个例子中,`evaluate`函数接受中缀表达式的字符串表示形式,通过两个栈(一个存放数值,一个存放运算符)实现了后缀表达式的求值过程。注意这只是一个基础的实现,实际应用中还需要处理更复杂的边界情况和错误检查。
阅读全文