1. 程式人生 > >藍橋杯 演算法訓練 表示式計算

藍橋杯 演算法訓練 表示式計算

演算法訓練 表示式計算
時間限制:1.0s 記憶體限制:256.0MB
提交此題
問題描述
  輸入一個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。
輸入格式
  輸入一行,包含一個表示式。
輸出格式
  輸出這個表示式的值。
樣例輸入
1-2+3*(4-5)
樣例輸出
-4
資料規模和約定
  表示式長度不超過100,表示式運算合法且運算過程都在int內進行。

#include<bits/stdc++.h>
using namespace std;
stack<string> s1;//最後儲存逆波蘭順序棧
stack<string
>
s2;//先存的是逆波蘭倒序棧 stack<int > s3;//數字棧 map<string ,int > d; string s; void runin(string c) { //cout<<c<<endl; if(d[c]>d[s1.top()]) s1.push(c); else if(c=="(") s1.push("!"); else if(c==")") { while(s1.top()!="!") { s2.push(s1.top()); s1.pop(); } s1.pop(); } else
{ s2.push(s1.top()); s1.pop(); s1.push(c); } //cout<<s1.size()<<endl; } int main() { d["#"] = 0; d["+"] = 1; d["-"] = 1; d["*"] = 2; d["/"] = 2; while(cin>>s) { s1.push("#"); string de; for(int i=0;s[i];) { //cout<<s[i]<<' ';
if(s[i]>='0'&&s[i]<='9') { while(s[i]>='0'&&s[i]<='9') de+=s[i++]; s2.push(de); de.clear(); } if(!(s[i]>='0'&&s[i]<='9')) { string tt; tt+=s[i]; //cout<<tt<<endl; runin(tt); tt.clear(); } i++; } while(s1.size()&&s1.top()!="#") { //cout<<s1.top()<<endl; s2.push(s1.top()); s1.pop(); } s1.pop(); while(s2.size()) { //cout<<s2.top()<<' ';//逆波蘭式 s1.push(s2.top()); s2.pop(); } while(s1.size()) { if(d[s1.top()]) { int l=s3.top();s3.pop(); int r=s3.top();s3.pop(); // cout<<l<<' '<<r<<' '<<s1.top()<<endl; if(s1.top()=="+") s3.push(l+r); if(s1.top()=="-") s3.push(r-l); if(s1.top()=="*") s3.push(l*r); if(s1.top()=="/") s3.push(r/l); } else { de=s1.top(); int xx=0; for(int i=0;de[i];i++) { xx=xx*10+de[i]-'0'; } s3.push(xx); } s1.pop(); } //cout<<endl; cout<<s3.top()<<endl; } }