中缀表达式转换为后缀表达式并求值用C++写出来的代码,且不用#include<stack>头文件
时间: 2023-06-14 22:05:00 浏览: 81
中缀表达式转换为后缀表达式并求值的算法是经典的栈应用,虽然可以手写栈,但为了方便,这里使用 STL 的 vector 模拟栈。
```c++
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
// 判断是否为运算符
bool is_operator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
// 判断运算符优先级
int priority(char c) {
if (c == '+' || c == '-')
return 1;
else if (c == '*' || c == '/')
return 2;
else
return 0;
}
// 中缀表达式转换为后缀表达式
string infix_to_postfix(string infix) {
vector<char> s; // 模拟栈
string postfix; // 后缀表达式
for (int i = 0; i < infix.length(); i++) {
char c = infix[i];
if (isdigit(c)) {
// 数字直接加入后缀表达式
postfix += c;
} else if (is_operator(c)) {
// 运算符
while (!s.empty() && is_operator(s.back()) &&
priority(s.back()) >= priority(c)) {
// 比当前运算符优先级高或相等的运算符出栈
postfix += s.back();
s.pop_back();
}
s.push_back(c);
} else if (c == '(') {
// 左括号入栈
s.push_back(c);
} else if (c == ')') {
// 右括号,将左括号之后的运算符出栈
while (!s.empty() && s.back() != '(') {
postfix += s.back();
s.pop_back();
}
s.pop_back(); // 弹出左括号
}
}
// 将栈中剩余的运算符加入后缀表达式
while (!s.empty()) {
postfix += s.back();
s.pop_back();
}
return postfix;
}
// 计算后缀表达式
int evaluate_postfix(string postfix) {
vector<int> s; // 模拟栈
for (int i = 0; i < postfix.length(); i++) {
char c = postfix[i];
if (isdigit(c)) {
// 数字入栈
s.push_back(c - '0');
} else if (is_operator(c)) {
// 运算符,弹出栈顶两个数字进行计算
int b = s.back(); s.pop_back();
int a = s.back(); s.pop_back();
int result;
if (c == '+')
result = a + b;
else if (c == '-')
result = a - b;
else if (c == '*')
result = a * b;
else if (c == '/')
result = a / b;
s.push_back(result);
}
}
return s.back(); // 栈中剩余的数字即为最终结果
}
int main() {
string infix = "3+(4*5-(6/2))";
string postfix = infix_to_postfix(infix);
cout << postfix << endl;
int result = evaluate_postfix(postfix);
cout << result << endl;
return 0;
}
```
输出结果为:
```
345*62/-+
13
```