#include<iostream> #include<string> #include<map> using namespace std; int getNum(const string& s,int &pos){ int l=s.size(); int n=0; for(;pos<l&&s[pos]>='0'&&s[pos]<='9';++pos) n=n*10+s[pos]-'0'; return n; } string numToStr(int num){ string str=""; while(num){ str+=num%10+'0'; num/=10; } int l=str.size(); for(int i=0;i<l/2;++i){ char t=str[i]; str[i]=str[l-i-1]; str[l-i-1]=t; } return str; } void midfixToSuffix(const string& midfix,string& suffix,map<char,int>& rule){ suffix=""; int l=midfix.size(); const int STACKSIZE=100; const char MARK='0'; const int EMPTY=0; char sta[STACKSIZE]; int top=0; sta[EMPTY]=MARK; for(int pos=0;pos<l;){ int temp=pos; int n=getNum(midfix,pos); if(temp!=pos){ string str=numToStr(n); suffix+=str; suffix+=" "; } if(pos>=l)break; char ope=midfix[pos++]; if(ope==')'){ do{ if(sta[top--]!='('){ suffix+=sta[top+1]; suffix+=" "; } }while(sta[top+1]!='('); continue; } else if(ope=='('){ sta[++top]=ope; continue; } while(rule[sta[top]]>=rule[ope]){ if(sta[top]=='(')break; suffix+=sta[top--]; suffix+=" "; } sta[++top]=ope; } while(top>EMPTY){ suffix+=sta[top--]; suffix+=" "; } } double suffixGetAnswer(const string& suffix){ const int STACKSIZE=100; double sta[STACKSIZE]; int top=-1; int l=suffix.size(); for(int pos=0;pos<l;){ int t; do{ t=pos; int n=getNum(suffix,pos); if(t!=pos){ sta[++top]=n; ++pos; } }while(t!=pos); char ope=suffix[pos++]; ++pos; double n1=sta[top--]; double n2=sta[top--]; switch(ope){ case '+': sta[++top]=n1+n2; break; case '-': sta[++top]=n2-n1; break; case '*': sta[++top]=n2*n1; break; case '/': sta[++top]=n2/n1; } } return sta[0]; } int main(){ map<char,int> rule; rule['0']=0; rule['+']=1; rule['-']=1; rule['*']=2; rule['/']=2; rule['(']=3; rule[')']=3; string midfix="(12-(2/(2/2)+2*4))/2-10"; string suffix; midfixToSuffix(midfix,suffix,rule); double ans=suffixGetAnswer(suffix); cout<<suffix<<"/n"<<ans<<endl; return 0; }