使用C++,合理运用栈,按照教材中的运算优先级,编程实现任意中缀算术表达式(可以只包含’+’、’-‘、’*’、’/’等双目运算符、小括号和结束符)的求值运算,给我完整详细的代码
时间: 2024-10-10 07:05:02 浏览: 36
C语言:中缀算术表达式求值(栈 附答案).docx
在C++中,我们可以使用栈数据结构来处理中缀表达式的计算。这里是一个基本的解决方案,遵循递归下降解析器的思想:
```cpp
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int precedence(char op) {
if (op == '+' || op == '-') return 1;
if (op == '*' || op == '/') return 2;
return -1; // 操作符的优先级低于其他运算符
}
double applyOperator(double a, double b, char op) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
default: throw invalid_argument("Invalid operator");
}
}
double evaluate(string tokens) {
stack<double> values;
stack<char> ops;
for (char token : tokens) {
if (isdigit(token)) { // 如果是数字,直接压入值栈
double num = 0;
while (isdigit(tokens[++tokens])) {
num = num * 10 + token - '0';
}
values.push(num);
} else if (token == '(') { // 开始新的运算
ops.push(token);
} else if (token == ')') { // 结束一个运算
while (!ops.empty() && ops.top() != '(') {
double val2 = values.top();
values.pop();
double val1 = values.top();
values.pop();
char op = ops.top();
ops.pop();
values.push(applyOperator(val1, val2, op));
}
if (!ops.empty()) {
ops.pop(); // 出去左括号
}
} else { // 遇到运算符
while (!ops.empty() && precedence(ops.top()) >= precedence(token)) {
double val2 = values.top();
values.pop();
double val1 = values.top();
values.pop();
char op = ops.top();
ops.pop();
values.push(applyOperator(val1, val2, op));
}
ops.push(token);
}
}
// 处理剩余的运算
while (!ops.empty()) {
double val2 = values.top();
values.pop();
double val1 = values.top();
values.pop();
char op = ops.top();
ops.pop();
values.push(applyOperator(val1, val2, op));
}
return values.top(); // 返回最终结果
}
int main() {
string expression = "3+5*(4-6)/2";
try {
cout << "Result: " << evaluate(expression) << endl;
} catch (invalid_argument& e) {
cerr << "Error: " << e.what() << endl;
}
return 0;
}
```
这个程序首先定义了运算符的优先级,然后遍历输入的字符串,当遇到操作数时将其推入值栈,遇到运算符时根据优先级处理已有的运算并推入运算符栈。最后,处理完所有运算后返回值栈顶的结果。
请注意,这个示例假设输入表达式是有效的。实际应用中,你可能需要添加更多的错误检查和输入验证。
阅读全文