思路:
将中缀表达式转化为后缀表达式,完成表达式求值。
这里采用辅助栈的方法,将中缀表达式转化为后缀表达式:
给操作符设置优先级:
map<char,int>mp;
mp['#']=0;
mp['(']=mp[')']=1;
mp['+']=mp['-']=2;
mp['*']=mp['/']=3;
这里设置了操作符#,并把优先级设为最低。将#放置在辅助栈的栈底,作用与链表中的头节点的作用类似。
在辅助栈中,从 栈底 到 ' ( ' 之前 和 ' ( ' 到 栈顶,每个操作符的优先级是严格递增的
开一个辅助栈,用来存放操作符。
栈对不同优先级的操作符采用不同策略:
如果当前操作符的优先级大于栈顶元素的 或者 当前操作符为 ' ( ',直接将操作符推入栈。
如果当前操作符的优先级小于等于栈顶元素的,那么将栈顶元素弹出成为后缀表达式,再将当前操作符推入栈。
如果当前操作符为 ' ) ',将栈里的元素弹出成为后缀表达式,知道碰到 ' ( '
#include <bits/stdc++.h>
using namespace std;
int main()
{
map<char,int>mp;
mp['#']=-1;
mp['(']=mp[')']=0;
mp['+']=mp['-']=1;
mp['*']=mp['/']=2;
stack<char>sta;
vector<string>ve;
string str,ans;
cin>>str;
sta.push('#');
for(int i=0;i<str.size();i++)
{
if(isdigit(str[i]))
ans+=str[i];
else
{
if(ans!="")
ve.push_back(ans);
ans.clear();
if(str[i]=='(')
{
sta.push('(');
continue;
}
else if(str[i]==')')
{
while(sta.top()!='(')
{
ve.push_back(string(1,sta.top()));
sta.pop();
}
sta.pop();
continue;
}
while(mp[str[i]]<=mp[sta.top()])
{
ve.push_back(string(1,sta.top()));
sta.pop();
}
sta.push(str[i]);
}
}
while(sta.top()!='#')
{
ve.push_back(string(1,sta.top()));
sta.pop();
}
stack<int> st;
for(int i=0;i<ve.size();i++)
{
if(!isdigit(ve[i][0]))
{
int b=st.top();
st.pop();
int a=st.top();
st.pop();
if(ve[i]=="+")
a+=b;
else if(ve[i]=="-")
a-=b;
else if(ve[i]=="*")
a*=b;
else if(ve[i]=="/")
a/=b;
st.push(a);
}
else
{
int num=0;
for(int j=0;j<ve[i].size();j++)
num=num*10+ve[i][j]-'0';
st.push(num);
}
}
cout<<st.top();
return 0;
}