解题思路:见代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <sstream>
#include <stack>
#include <map>
using namespace std;
string change(string s)
{
string partS="";
stringstream c_room;
c_room.str("");
stack<char> symbol; // 操作符栈
map<char, int> rank; // 操作符优先级
rank['+'] = rank['-'] = 1;
rank['*'] = rank['/'] = 2;
char c;
int i;
for (i = 0; i < s.length(); i++) // 扫描中缀式
{
c = s[i];
if (c <= '9' && c >= '0') //数字直接输出
c_room << c;
else
{
c_room << ' ';
if (c == '(') //左括号压入
symbol.push(c);
else if (c == ')') //右括号一直出栈直到遇到左括号
{
while (symbol.top() != '(')
{
c_room << symbol.top()<<' ';
symbol.pop();
}
symbol.pop();
}
else
{
while (!symbol.empty() && rank[c] <= rank[symbol.top()])
{ // 当前操作符优先级低于或等于栈顶操作符时不断出栈,直到优先级高于栈顶操作符
c_room << symbol.top()<<' ';
symbol.pop();
}
symbol.push(c);
}
}
}
c_room << ' ';
while (!symbol.empty())
{
c_room << symbol.top()<<' ';
symbol.pop();
}
queue<string> ans;
while (c_room >> partS)
ans.push(partS);
string RE_string="";
while (!ans.empty())
{
RE_string += ans.front();
ans.pop();
if (ans.size() != 0)
RE_string += ' ';
}
return RE_string;
}
int main()
{
string s;
cin >> s;
cout << change(s) << endl;
return 0;
}