#include<iostream>
#include<stack>
#include<string>
using namespace std;
int getrank(char a) {
switch (a) {
case '+':return 1;
case '-':return 1;
case '*':return 2;
case '/':return 2;
case '^':return 3;
default:
cout << "输入错误!";
exit(0);
}
}
string transfer(string str) {//中缀转后缀
stack<char>S; int rank; string ans = "";//ans为最终答案,以字符串形式存储
int i = 0;
while (str[i]!='\0') {
if (i > 0 && ('0' > str[i - 1] || str[i - 1] > '9'))//在每个数之前添加空格以便于区分
ans += ' ';
if ('0' <= str[i] && str[i] <= '9') {
ans += str[i++]; continue;
}
if (str[i] == '(') {
S.push(str[i++]); continue;
}
else if (str[i] == ')') {
while (S.top() != '(') {
ans += ' ';//每个运算符之前添加空格
ans += S.top();
S.pop();
}
S.pop();
}
else{
rank = getrank(str[i]);
if (S.empty() || S.top() == '(' || rank > getrank(S.top()))//条件顺序不能乱,若不先判空,S.top()可能会报错
S.push(str[i]);
else {
ans += ' ';
ans += S.top();
S.pop();
S.push(str[i]);//
}
}
i++;
}
while (!S.empty()) {
ans += ' ';
ans += S.top();
S.pop();
}
return ans;
}
int main() {
string str;
cout << "请输入中缀表达式:\n";
cin >> str;//18*12^(16+15-13)*(21+101/3)
str=transfer(str);
cout << str;
return 0;
}
中缀转后缀C++(逆波兰式算法)
最新推荐文章于 2024-08-18 17:42:33 发布