中缀表达式转后转表达式
记录一下这个恶心的字符串模拟
#include <bits/stdc++.h>
using namespace std;
int main()
{
map<char, int> mp;
string str;
stack<char> s;
cin >> str;
bool isFirst = true;
mp['-'] = 1, mp['+'] = 1;
mp['*'] = 2, mp['/'] = 2;
mp['('] = 3, mp[')'] = 3;
for (int i = 0; i < str.size(); i++)
{
if ((i == 0 || str[i - 1] == '(') && (str[i] == '+' || str[i] == '-') || (str[i] >= '0' && str[i] <= '9') || str[i] == '.') //读入运算数/正负号(区别于加减号)/小数点
{
if (!isFirst)
{
cout << " ";
}
if (str[i] != '+') //省略正号
cout << str[i];
while (str[i + 1] == '.' || (str[i + 1] >= '0' && str[i + 1] <= '9')) //处理多位数
{
i++;
cout << str[i];
}
isFirst = false;
}
else
{
if (str[i] == ')') //处理右括号
{
while (!s.empty() && s.top() != '(')
{
cout << " " << s.top();
s.pop();
}
s.pop(); //弹出左括号
}
else if (s.empty() || mp[str[i]] > mp[s.top()]) //如果栈空||当前运算符优先级大于栈顶运算符优先级
{
s.push(str[i]);
}
else //当前运算符优先级小于等于栈顶运算符优先级
{
while (!s.empty() && s.top() != '(')
{
cout << " " << s.top();
s.pop();
}
s.push(str[i]); //将当前运算符压栈
}
}
}
while (!s.empty()) //将剩余元素弹栈
{
cout << " " << s.top();
s.pop();
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步