表达式求值easyx
时间: 2023-07-04 08:28:18 浏览: 85
表达式求值
4星 · 用户满意度95%
求表达式的值可以通过中缀表达式转后缀表达式,然后再用后缀表达式求值的方式来实现。具体步骤如下:
1. 初始化两个栈:运算符栈和操作数栈。
2. 从左到右遍历中缀表达式的每个元素,如果是操作数,则压入操作数栈中;如果是运算符,则执行以下操作:
(1) 如果运算符栈为空,或者运算符栈的栈顶元素为左括号,则将运算符压入运算符栈中。
(2) 如果运算符的优先级比栈顶元素的优先级高,则将运算符压入运算符栈中。
(3) 如果运算符的优先级比栈顶元素的优先级低或者相等,则从运算符栈中依次弹出运算符,并从操作数栈中弹出两个操作数,进行运算,将结果压入操作数栈中,直到运算符的优先级比栈顶元素的优先级高为止,然后将运算符压入运算符栈中。
(4) 如果是右括号,则从运算符栈中依次弹出运算符,并从操作数栈中弹出两个操作数,进行运算,将结果压入操作数栈中,直到弹出左括号为止。
3. 完成遍历后,如果运算符栈不为空,则从运算符栈中依次弹出运算符,并从操作数栈中弹出两个操作数,进行运算,将结果压入操作数栈中,直到运算符栈为空为止。
4. 最终的结果就是操作数栈中的唯一元素。
代码实现参考:
```c++
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int priority(char op) {
switch(op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
double calculate(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:
return 0;
}
}
double evaluate(string expr) {
stack<double> operands;
stack<char> operators;
for (int i = 0; i < expr.length(); i++) {
char ch = expr[i];
if (isdigit(ch)) {
double num = 0;
while (i < expr.length() && isdigit(expr[i])) {
num = num * 10 + (expr[i] - '0');
i++;
}
i--;
operands.push(num);
} else if (ch == '(') {
operators.push(ch);
} else if (ch == ')') {
while (operators.top() != '(') {
char op = operators.top();
operators.pop();
double b = operands.top();
operands.pop();
double a = operands.top();
operands.pop();
operands.push(calculate(a, b, op));
}
operators.pop();
} else if (priority(ch) > 0) {
while (!operators.empty() && priority(ch) <= priority(operators.top())) {
char op = operators.top();
operators.pop();
double b = operands.top();
operands.pop();
double a = operands.top();
operands.pop();
operands.push(calculate(a, b, op));
}
operators.push(ch);
}
}
while (!operators.empty()) {
char op = operators.top();
operators.pop();
double b = operands.top();
operands.pop();
double a = operands.top();
operands.pop();
operands.push(calculate(a, b, op));
}
return operands.top();
}
int main() {
string expr = "3+4*5-(6/2)";
double result = evaluate(expr);
cout << "Result: " << result << endl;
return 0;
}
```
阅读全文