nyoj 題目35 表示式求值
阿新 • • 發佈:2019-02-19
表示式求值
時間限制:3000 ms | 記憶體限制:65535 KB 難度:4- 描述
- ACM隊的mdd想做一個計算器,但是,他要做的不僅僅是一計算一個A+B的計算器,他想實現隨便輸入一個表示式都能求出它的值的計算器,現在請你幫助他來實現這個計算器吧。
比如輸入:“1+2/4=”,程式就輸出1.50(結果保留兩位小數)- 輸入
- 第一行輸入一個整數n,共有n組測試資料(n<10)。
每組測試資料只有一行,是一個長度不超過1000的字串,表示這個運算式,每個運算式都是以“=”結束。這個表示式裡只包含+-*/與小括號這幾種符號。其中小括號可以巢狀使用。資料保證輸入的運算元中不會出現負數。
資料保證除數不會為0 - 輸出
- 每組都輸出該組運算式的運算結果,輸出結果保留兩位小數。
- 樣例輸入
-
2 1.000+2/4= ((1+2)*5+1)/4=
- 樣例輸出
-
1.50 4.00
- 來源
- 上傳者
- 張雲聰
解法:先求出字尾表示式(逆波蘭式),然後計算(棧+stringstream)!
#include<bits/stdc++.h> using namespace std; string s,str; int yxj(char ch) { switch(ch) { case '+': case '-':return 1; case '*': case '/':return 2; default: return 0; } } int main() { int T; cin>>T; while(T--) { cin>>s; stack<char>pq; stack<double>qp; pq.push('#'); int len=s.size(),i=0; str.clear(); while(i<len-1) { if(s[i]=='(') { pq.push(s[i]); i++; } else if(s[i]==')') { while(pq.top()!='(') { str+=pq.top(); pq.pop(); str+=' '; } pq.pop(); i++; } else if(s[i]=='+'||s[i]=='-'||s[i]=='*'|s[i]=='/') { while(yxj(pq.top())>=yxj(s[i])) { str+=pq.top(); str+=' '; pq.pop(); } pq.push(s[i]); i++; } else { while(s[i]>='0'&&s[i]<='9'||s[i]=='.') { str+=s[i]; i++; } str+=' '; } } while(pq.top()!='#') { str+=pq.top(); pq.pop(); str+=' '; } stringstream ss(str); string buf; while(ss>>buf) { if(isdigit(buf[0])) { char a[100]; double num; int i=0; for(i=0;i<buf.size();i++) a[i]=buf[i]; a[i]='\0'; num=atof(a); qp.push(num); } else { double x=qp.top(); qp.pop(); double y=qp.top(); qp.pop(); if(buf=="+") qp.push(y+x); else if(buf=="-") qp.push(y-x); else if(buf=="*") qp.push(y*x); else if(buf=="/") qp.push(y/x); } } printf("%.2lf\n",qp.top()); } return 0; }