中缀表达式转换为后缀表达式并求值用C++写出来的代码
时间: 2023-06-14 09:05:03 浏览: 133
下面是中缀表达式转换为后缀表达式并求值的 C++ 代码,其中使用了栈来实现:
```cpp
#include <iostream>
#include <stack>
#include <string>
#include <sstream>
using namespace std;
int priority(char c) {
if (c == '*' || c == '/') {
return 2;
} else if (c == '+' || c == '-') {
return 1;
} else {
return 0;
}
}
string infix_to_postfix(string infix) {
stack<char> s;
stringstream postfix;
for (char c : infix) {
if (isdigit(c)) {
postfix << c;
} else if (c == '(') {
s.push(c);
} else if (c == ')') {
while (!s.empty() && s.top() != '(') {
postfix << s.top();
s.pop();
}
if (!s.empty() && s.top() == '(') {
s.pop();
}
} else {
while (!s.empty() && priority(c) <= priority(s.top())) {
postfix << s.top();
s.pop();
}
s.push(c);
}
}
while (!s.empty()) {
postfix << s.top();
s.pop();
}
return postfix.str();
}
double evaluate_postfix(string postfix) {
stack<double> s;
for (char c : postfix) {
if (isdigit(c)) {
s.push(c - '0');
} else {
double operand2 = s.top();
s.pop();
double operand1 = s.top();
s.pop();
if (c == '+') {
s.push(operand1 + operand2);
} else if (c == '-') {
s.push(operand1 - operand2);
} else if (c == '*') {
s.push(operand1 * operand2);
} else if (c == '/') {
s.push(operand1 / operand2);
}
}
}
return s.top();
}
int main() {
string infix = "3+4*5/(2-1)";
string postfix = infix_to_postfix(infix);
cout << "Infix expression: " << infix << endl;
cout << "Postfix expression: " << postfix << endl;
double result = evaluate_postfix(postfix);
cout << "Result: " << result << endl;
return 0;
}
```
对于输入的中缀表达式,程序首先将其转换为后缀表达式,然后再计算后缀表达式的值。在转换过程中,程序使用一个栈来存储运算符,按照优先级将运算符从栈中弹出,直到遇到比当前运算符优先级更低的运算符或者左括号。在计算后缀表达式的值时,程序同样使用一个栈来存储操作数,遇到运算符时从栈中弹出两个操作数进行计算,然后将计算结果压入栈中。最终,栈中剩下的唯一一个元素即为后缀表达式的值。
阅读全文