表达式求值
大半年没写题了,当初训练的时候怀着雄心壮志,后来基地给拆,哎
- 题目描述:就是计算3*3-1这种表达式的值
- 数据范围 :int
- 解题步骤:注意连个点:
判断优先级,这里是*大于等于/ 大于 + 大于等于 -,优先级相等或则大的先算
将123这种连着的字符变成数字
ac代码:
#include<iostream> #include<stack> #include<string> #include<map> #include<cctype> #include<cstdlib> #include<cstdio> using namespace std; stack<int>equa_int; stack<char>equa_char; string s; void solve(char ch){ map<char,int>ma; ma['-']=1,ma['+']=1,ma['/']=2,ma['*']=2,ma['(']=0,ma[')']=0; while(equa_int.size()>1&&ma[ch]<=ma[equa_char.top()]){//ch=='('不加入判断 char c=equa_char.top(); equa_char.pop(); if(c=='('){ if(ch==')')return ; else { equa_char.push('('); return ; } } else { int b=equa_int.top(); equa_int.pop(); int a=equa_int.top(); equa_int.pop(); int result=0; switch(c){ case '+':result=a+b;break; case '-':result=a-b;break; case '*':result=a*b;break; case '/':result=a/b;break; } equa_int.push(result); } } } int main(){ //freopen("io.txt","r",stdin); //freopen("io.txt","a+",stdout); cin>>s; //cout<<"@"<<endl; int flag=0; for(int i=0;i<s.length();i++){ if(isdigit(s[i])){ int x=s[i]-'0'; if(flag){ int tem=equa_int.top(); equa_int.pop(); x=tem*10+x; } equa_int.push(x); flag=1; } else { if(s[i]=='(') equa_char.push(s[i]); else { solve(s[i]); if(s[i]!=')') equa_char.push(s[i]); } flag=0; } //if(equa_int.size()!=0)cout<<equa_int.top()<<' '; //cout<<i<<' '<<equa_int.size()<<' '<<equa_char.size()<<endl; } solve('-'); cout<<equa_int.top()<<endl; return 0; }