合理运用栈,按照教材中的运算优先级,编程实现任意中缀算术表达式(可以只包含’+’、’-‘、’*’、’/’等双目运算符、小括号和结束符)的求值运算。用C++语言
时间: 2024-10-11 18:07:21 浏览: 27
在C++中,我们可以使用栈数据结构以及中缀表达式的转换规则来解决这个问题。这里的关键在于将中缀表达式转换成后缀(逆波兰)表达式,然后使用两个栈分别处理数字和操作符,遵循“左递归下降”解析算法。以下是简单的步骤:
1. 创建两个栈,`numStack`用于存储数字,`opStack`用于存储操作符。
2. 遍历输入的中缀表达式,按字符处理:
- 如果是数字,直接压入`numStack`。
- 如果是操作符,比较其优先级与`opStack`顶的操作符:
- 如果是较高优先级的操作符,将其压入`opStack`;
- 如果是更低或相等优先级的操作符,先从`opStack`弹出并计算直到遇到比当前操作符优先级低的,再将当前操作符压入。
- 遇到左括号,压入`opStack`。
- 遇到右括号,弹出`opStack`中的操作符直至遇到左括号,然后计算得到结果,并将结果压回`numStack`。
3. 当遍历完所有字符后,`numStack`中只剩下一个元素,即为最终的结果。
下面是简化版的C++代码示例:
```cpp
#include <iostream>
#include <stack>
#include <string>
#include <cctype>
int precedence(char op) {
if (op == '+' || op == '-') return 1;
if (op == '*' || op == '/') return 2;
return 0; // 非操作符字符
}
bool isOperator(char ch) {
return ch == '+' || ch == '-' || ch == '*' || ch == '/';
}
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;
}
return 0; // 这里应该不会到达
}
int evaluateExpression(const std::string& expression) {
std::stack<int> numStack;
std::stack<char> opStack;
for (char ch : expression) {
if (isdigit(ch)) {
int val = 0;
while (isdigit(ch)) {
val = val * 10 + ch - '0';
ch = getchar(); // 这里假设已经处理过字符串边界
}
numStack.push(val);
} else if (isOperator(ch)) {
while (!opStack.empty() && precedence(opStack.top()) >= precedence(ch)) {
int val2 = numStack.top();
numStack.pop();
int val1 = numStack.top();
numStack.pop();
char op = opStack.top();
opStack.pop();
numStack.push(applyOp(val1, val2, op));
}
opStack.push(ch);
} else if (ch == '(') {
opStack.push(ch);
} else if (ch == ')') {
while (!opStack.empty() && opStack.top() != '(') {
int val2 = numStack.top();
numStack.pop();
int val1 = numStack.top();
numStack.pop();
char op = opStack.top();
opStack.pop();
numStack.push(applyOp(val1, val2, op));
}
opStack.pop(); // 出栈左括号
}
}
while (!opStack.empty()) {
int val2 = numStack.top();
numStack.pop();
int val1 = numStack.top();
numStack.pop();
char op = opStack.top();
opStack.pop();
numStack.push(applyOp(val1, val2, op));
}
return numStack.top();
}
int main() {
std::string infixExp = "2 + 3 * (4 - 5)";
int result = evaluateExpression(infixExp);
std::cout << "结果: " << result << std::endl;
return 0;
}
```
阅读全文