排程場演算法-表示式計算
阿新 • • 發佈:2018-11-19
也不是什麼新的東西把,排程場也不說了,就說說我寫過的三個版本表示式的成長吧
第一個簡單計算器,沒有括號沒有單獨考慮加減乘除優先順序
第二個等價表示式主要是沒有值吧,全代固定變數,然後沒有除法
列出來:
[1]簡單計算器:字串處理之簡單計算器
[2]等價表示式:轉逆波蘭表示式-OpenJudge[等價表示式]
慢慢填坑,這個表示式計算用到 [1]的擷取浮點數方法,加上[2]的轉逆波蘭及逆波蘭表示式求值,直接貼程式碼了
#include<bits/stdc++.h> using namespace std; void Tranfer_Equal(string Init_Equal,string& Equal,queue<double>& Num_Que) { stack<char> Signal; int i=0; int Point_Flag=0; int Pow=10; double Number=0; while(Init_Equal[i]!='#') { if((Init_Equal[i]>='0'&&Init_Equal[i]<='9')||Init_Equal[i]=='.') { if(Init_Equal[i]=='.') { Point_Flag=1; Pow=10; i++; continue; } if(Point_Flag) { Number+=((Init_Equal[i]-'0')*1.0)/Pow; Pow*=10; } else Number=Number*10+(Init_Equal[i]-'0'); if((Init_Equal[i+1]>'9'||Init_Equal[i+1]<'0')&&Init_Equal[i+1]!='.') { Equal+='?'; Num_Que.push(Number); Number=0; Pow=10; Point_Flag=0; } } else if(Init_Equal[i]=='(') { Signal.push(Init_Equal[i]); } else if(Init_Equal[i]==')') { while(Signal.top()!='(') { Equal+=Signal.top(); Signal.pop(); } Signal.pop(); } else if(Init_Equal[i]=='+'||Init_Equal[i]=='-') { while(!Signal.empty()&&Signal.top()!='(') { Equal+=Signal.top(); Signal.pop(); } Signal.push(Init_Equal[i]); } else if(Init_Equal[i]=='*'||Init_Equal[i]=='/') { while(!Signal.empty()&&Signal.top()!='('&&(Signal.top()=='*'||Signal.top()=='/')) //乘法和除法優先順序一致 { Equal+=Signal.top(); Signal.pop(); } Signal.push(Init_Equal[i]); } else continue; i++; } while(!Signal.empty()) { Equal+=Signal.top(); Signal.pop(); } } double Get_Sum(string& Equal,queue<double> Num_Que) { stack<double> Data; for(int i=0;i<Equal.length();i++) { double Val1,Val2; if(Equal[i]=='?') { Data.push(Num_Que.front()); Num_Que.pop(); } else if(Equal[i]=='+') { Val1=Data.top(); Data.pop(); Val2=Data.top(); Data.pop(); Data.push(Val1+Val2); } else if(Equal[i]=='-') { Val1=Data.top(); Data.pop(); Val2=Data.top(); Data.pop(); Data.push(Val2-Val1); } else if(Equal[i]=='*') { Val1=Data.top(); Data.pop(); Val2=Data.top(); Data.pop(); Data.push(Val1*Val2); } else if(Equal[i]=='/') { Val1=Data.top(); Data.pop(); Val2=Data.top(); Data.pop(); Data.push(Val2/Val1); } else continue; } return Data.top(); } int main() { int t; cin>>t; while(t--) { string Init_Equal; string Equal; queue<double> Num_Que; cin>>Init_Equal; Tranfer_Equal(Init_Equal,Equal,Num_Que); /*for(int i=0;i<Equal.length();i++) { if(Equal[i]=='?') { cout<<Num_Que.front(); Num_Que.pop(); } else cout<<Equal[i]; } cout<<endl;*/ double Res=Get_Sum(Equal,Num_Que); cout<<fixed<<setprecision(4)<<Res<<endl; } return 0; }