用栈实现中缀表达式求值的c++代码
时间: 2024-10-21 13:09:42 浏览: 51
在C++中,使用栈(Stack)可以实现中缀表达式的计算(逆波兰表示法,也称为后缀表达式)。这里是一个简单的例子:
```cpp
#include <stack>
#include <string>
#include <sstream>
using namespace std;
// 定义操作数和操作的优先级
const string PRECEDENCE = "^*/+-";
int calculate(string expression) {
stack<int> values; // 存放操作数
stack<char> operators; // 存放运算符
for (char c : expression) {
if (isdigit(c)) { // 如果是数字,直接压入堆栈
int num = 0;
while (isdigit(c)) {
num = num * 10 + (c - '0');
c = getchar(); // 每次读取下一个字符
}
values.push(num);
} else if (c == '(') { // 开始一个新的子表达式
operators.push(c);
} else if (c == ')') { // 结束子表达式并计算结果
while (!operators.top() || PRECEDENCE[operators.top()] != '(') {
int val2 = values.top();
values.pop();
int val1 = values.top();
char op = operators.top();
values.pop();
operators.pop();
switch (op) {
case '+':
values.push(val1 + val2);
break;
case '-':
values.push(val1 - val2);
break;
case '*':
values.push(val1 * val2);
break;
case '/':
values.push(val1 / val2);
break;
default: break;
}
}
operators.pop(); // 出去左括号
} else if (prec(c, operators.top())) { // 操作符的优先级高于栈顶元素
operators.push(c);
} else { // 运算符优先级低于栈顶元素,出栈并计算
while (!operators.empty() && prec(c, operators.top())) {
int val2 = values.top();
values.pop();
int val1 = values.top();
char op = operators.top();
values.pop();
operators.pop();
switch (op) {
case '+':
values.push(val1 + val2);
break;
case '-':
values.push(val1 - val2);
break;
case '*':
values.push(val1 * val2);
break;
case '/':
values.push(val1 / val2);
break;
default: break;
}
}
operators.push(c);
}
}
while (!operators.empty()) {
int val2 = values.top();
values.pop();
int val1 = values.top();
char op = operators.top();
values.pop();
operators.pop();
switch (op) {
case '+':
values.push(val1 + val2);
break;
case '-':
values.push(val1 - val2);
break;
case '*':
values.push(val1 * val2);
break;
case '/':
values.push(val1 / val2);
break;
default: break;
}
}
return values.top(); // 返回最终结果
}
bool prec(char op1, char op2) {
if (op2 == '(') return false;
return PRECEDENCE.find(op1) > PRECEDENCE.find(op2);
}
int main() {
string exp;
cout << "请输入一个中缀表达式: ";
getline(cin, exp);
int result = calculate(exp);
cout << "计算结果为: " << result << endl;
return 0;
}
```
在这个示例中,我们首先读取用户输入的中缀表达式,然后通过栈结构逐步解析、计算并返回结果。
阅读全文