NC137 表达式求值
中缀表达式转后缀表达式,只不过在转后缀表达式的过程中符号弹出的话直接计算出结果。
符号的优先级大于符号栈栈顶符号,直接压入,优先级小于或等于符号栈栈顶符号,不断弹出符号栈元素
class Solution {
public:
stack<int> st1;
stack<char> st2;
map<char,int> mp;
int jisuan(char c)
{
int b=st1.top();
st1.pop();
int a=st1.top();
st1.pop();
// cout<<a<<" "<<b;
int x=0;
if(c=='-') x=a-b;
else if(c=='+') x=a+b;
else x=a*b;
// cout<<" "<<x<<endl;
return x;
}
int solve(string s)
{
mp['*']=2;
mp['-']=1;
mp['+']=1;
mp['(']=0;
for(int i=0;i<s.size();i++)
{
if(s[i]>='0'&&s[i]<='9')
{
int sum=0;
while(i<s.size()&&s[i]>='0'&&s[i]<='9')
{
sum=sum*10+(s[i]-'0');
i++;
}
// cout<<sum<<endl;
i=i-1;
st1.push(sum);
}
else if(s[i]=='+'||s[i]=='-'||s[i]=='*')
{
while(!st2.empty()&&mp[s[i]]<=mp[st2.top()])
{
int x=jisuan(st2.top());
st2.pop();
st1.push(x);
}
st2.push(s[i]);
}
else if(s[i]=='(')
{
st2.push(s[i]);
}
else if(s[i]==')')
{
while(st2.top()!='(')
{
st1.push(jisuan(st2.top()));
st2.pop();
}
st2.pop();
}
}
while(!st2.empty())
{
int x=jisuan(st2.top());
// cout<<x<<endl;
st1.push(x);
st2.pop();
}
int result=st1.top();
return result;
}
};