算术表达式求值C++
时间: 2023-11-14 21:07:50 浏览: 110
对于算术表达式求值,可以使用栈来实现。具体步骤如下:
1. 定义两个栈,一个存储操作数,一个存储操作符。
2. 从左到右遍历表达式中的每个字符。
3. 如果当前字符是数字,则将其转换为整数并压入操作数栈中。
4. 如果当前字符是操作符,则比较其与操作符栈顶元素的优先级。
- 如果当前操作符优先级高于栈顶操作符,则将其压入操作符栈中。
- 否则,将操作符栈顶元素弹出并压入操作数栈中,直到当前操作符的优先级大于栈顶操作符的优先级。
5. 如果当前字符是括号,则:
- 如果是左括号,则将其压入操作符栈中。
- 如果是右括号,则依次弹出操作符栈顶元素并压入操作数栈中,直到遇到左括号为止。
6. 当表达式遍历完后,依次弹出操作符栈顶元素并压入操作数栈中,直到操作符栈为空。
7. 最终,操作数栈中剩余的元素即为表达式的计算结果。
以下是C++代码实现:
```c++
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int priority(char op) {
if (op == '+' || op == '-') return 1;
if (op == '*' || op == '/') return 2;
return 0;
}
int calculate(int a, int b, char op) {
if (op == '+') return a + b;
if (op == '-') return a - b;
if (op == '*') return a * b;
if (op == '/') return a / b;
return 0;
}
int evaluate(string expr) {
stack<int> nums;
stack<char> ops;
for (int i = 0; i < expr.length(); i++) {
char c = expr[i];
if (isdigit(c)) {
int num = c - '0';
while (i + 1 < expr.length() && isdigit(expr[i + 1])) {
num = num * 10 + (expr[i + 1] - '0');
i++;
}
nums.push(num);
} else if (c == '(') {
ops.push(c);
} else if (c == ')') {
while (ops.top() != '(') {
int b = nums.top(); nums.pop();
int a = nums.top(); nums.pop();
char op = ops.top(); ops.pop();
nums.push(calculate(a, b, op));
}
ops.pop();
} else if (c == '+' || c == '-' || c == '*' || c == '/') {
while (!ops.empty() && priority(ops.top()) >= priority(c)) {
int b = nums.top(); nums.pop();
int a = nums.top(); nums.pop();
char op = ops.top(); ops.pop();
nums.push(calculate(a, b, op));
}
ops.push(c);
}
}
while (!ops.empty()) {
int b = nums.top(); nums.pop();
int a = nums.top(); nums.pop();
char op = ops.top(); ops.pop();
nums.push(calculate(a, b, op));
}
return nums.top();
}
int main() {
string expr = "3+4*5-(6+7)";
cout << evaluate(expr) << endl; // 输出: 10
return 0;
}
```
阅读全文