(1)首先置OPND栈为空栈,表达式起始符“(”为OPTR栈的栈底元素; (2)依次读入表达式中的每个字符,若是运算数则进OPND栈,若是运算符则和OPTR栈的栈顶运算符比较优先级后作相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素为“(”且当前读入的字符为“#”)。的c++代码
时间: 2024-03-26 21:36:08 浏览: 129
以下是一个简单的基于栈的表达式求值的代码示例,可以作为参考:
```c++
#include <iostream>
#include <stack>
#include <string>
using namespace std;
// 返回运算符的优先级
int getPriority(char c) {
if (c == '*' || c == '/') {
return 2;
} else if (c == '+' || c == '-') {
return 1;
} else {
return 0;
}
}
// 计算两个数的运算结果
int calc(int a, int b, char op) {
if (op == '+') {
return a + b;
} else if (op == '-') {
return a - b;
} else if (op == '*') {
return a * b;
} else if (op == '/') {
return a / b;
} else {
return 0; // 不支持的运算符
}
}
// 计算表达式的值
int eval(const string& expr) {
stack<int> opnd; // 操作数栈
stack<char> optr; // 运算符栈
optr.push('('); // 表达式起始符
expr += '#'; // 表达式结束符
for (int i = 0; i < expr.size(); i++) {
char c = expr[i];
if (c >= '0' && c <= '9') { // 数字
int num = c - '0';
while (i + 1 < expr.size() && expr[i + 1] >= '0' && expr[i + 1] <= '9') {
num = num * 10 + expr[i + 1] - '0';
i++;
}
opnd.push(num);
} else { // 运算符
while (true) {
char top = optr.top();
if (top == '(' && c == ')') { // 匹配括号
optr.pop();
break;
} else if (getPriority(c) > getPriority(top)) { // 当前运算符优先级高于栈顶运算符
optr.push(c);
break;
} else { // 当前运算符优先级不高于栈顶运算符
optr.pop();
int b = opnd.top();
opnd.pop();
int a = opnd.top();
opnd.pop();
opnd.push(calc(a, b, top));
}
}
}
}
return opnd.top();
}
int main() {
string expr = "1+2*3-4/2"; // 期望结果为 5
int result = eval(expr);
cout << result << endl;
return 0;
}
```
阅读全文