小明在你的帮助下,破密了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”,“)”,“0-9”,“+”,“-”,“*”,“/”,“^”,求出的值就是密码。小明数学学得不好,还需你帮他的忙。(“/”用整数除法)
【输入】共1行,为一个算式。
【输出】共1行,就是密码。
【输入样例】1+(3+2)*(7^2+6*9)/(2)【输出样例】
258(2)问题分析
在做这道题之前,我先做了中缀表达式,做完中缀表达式之后再看这道题我发现很简单,思路与中缀表达式差不多,而且细节更好,只要了解栈的应用这道题还是很好解答。
(3)代码实现#includeusing namespace std; stack digit; stack symbol; int level(char c){ if(c=='+'||c=='-') return 1; if(c=='*'||c=='/') return 2; if(c=='^') return 3; return 0; } void cal(){ int a=digit.top(); digit.pop(); int b=digit.top(); digit.pop(); char c=symbol.top(); symbol.pop(); if(c=='+') digit.push(b+a); else if(c=='-') digit.push(b-a); else if(c=='*') digit.push(b*a); else if(c=='/') digit.push(b/a); else if(c=='^') digit.push(pow(b,a)); } int main(){ string str; cin>>str; int len=str.length(); int x=0; bool tag=false; for(int i=0;i ='0'&&str[i]<='9'){ x=x*10+str[i]-'0'; tag=true; }else{ if(tag){ digit.push(x); x=0; tag=false; } if(str[i]=='('){ symbol.push(str[i]); continue; } if(str[i]==')'){ while(symbol.top()!='('){ cal(); } symbol.pop(); continue; } while(!symbol.empty()&&level(symbol.top())>=level(str[i])){ cal(); }symbol.push(str[i]); } } if(tag){ digit.push(x); } while(!symbol.empty()){ cal(); } cout << digit.top() << endl; return 0; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)