看了一圈好像没几个人写的是对的,被浪费了1个小时很无语。特来说一下我的理解
1.倒序
2.优先级高则压入,优先级低则弹出
3.')'的压入优先级为3,而弹出优先级为0,其他均可设置为相同值
代码如下
#include<bits/stdc++.h>
using namespace std;
int priority(char c)
{
int p=0;
if(c=='+'||c=='-') p=1;
else if(c=='*'||c=='/') p=2;
else if(c==')') p=0;
return p;
}
bool isop(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/') return true;
return false;
}
int main()
{
stack<char> st;
string str("a+b*(c-d)-e/f");
reverse(str.begin(),str.end());//逆向
string res;
for(char c:str)
{
if(isop(c)==true)
{
int pri=priority(c);
//大于等于push,小于pop
while(!st.empty()&&pri<priority(st.top()))
{
res+=st.top();
st.pop();
}
st.push(c);
}
else if(c==')')
{
st.push(c);
}
else if(c=='(')
{
while(!st.empty()&&st.top()!=')')
{
res+=st.top();
st.pop();
}
if(!st.empty()) st.pop();
}
else
{
res+=c;
}
}
while(!st.empty())
{
res+=st.top();
st.pop();
}
reverse(res.begin(),res.end());
cout<<res;
return 0;
}