使用棧來計算字尾表示式
阿新 • • 發佈:2020-10-14
字尾表示式
我們平時寫的都是中綴表示式,也就是將運算子寫在2個運算元中間
而後綴表示式 則是將運算子寫在2個運算元後面
例如:
(a+b)*c-(a+b)/e 的字尾表示式為:ab+c*ab+e/-
計算思路
從左到右掃描輸入串(string陣列):
1、若當前字元為數字(運算元),則將其放入棧
2、若當前字元為運算子,則依次取出棧頂的2個數,進行對應的運算,並將運算結果放入棧
3、指標讀取下一個字元,回到第1步
當遍歷完陣列後,棧中的唯一一個元素即為計算結果
程式碼實現(C++)
假設輸入的字串是一個 string類的陣列
全域性定義棧的相關變數和方法
const int N=100; //定義棧的最大容量 string data[N]; //使用陣列表示棧 int top=-1; //指向棧頂元素下標 //判斷棧是否為空 bool isEmpty(){ return top==-1 ? true : false; } //入棧 void Push(string ele){ if(top>=N-1){ cout<<"棧已滿,無法插入"<<endl; return; } data[top+1]=ele; top++; return; } //出棧 string Pop(){ if(isEmpty()==true){ cout<<"棧已空,無法出棧"<<endl; return "!"; } string topEle=data[top]; data[top]="null"; top--; return topEle; }
除此之外,我們需要一個判斷當前字元是否為數字的函式(利用ASCII碼判別)
bool isDigit(string v){
if(int(v[0])<=57&&int(v[0])>=48){
return true;
}else{
return false;
}
}
用於計算表示式結果的函式
//傳入string陣列以及陣列長度 void calculate(string input[],int len){ for(int i=0;i<len;i++){ if(isDigit(input[i])==true){ Push(input[i]); }else{ // 將取出的棧頂元素轉換成int int v2=stoi(Pop()); int v1=stoi(Pop()); if(input[i]=="+"){ Push(to_string(v1+v2)); }else if(input[i]=="-"){ Push(to_string(v1-v2)); }else if(input[i]=="*"){ Push(to_string(v1*v2)); } else if(input[i]=="/"){ Push(to_string(v1/v2)); }else{ cout<<"ERROR"<<endl; } } } cout<<data[0]<<endl; return; }
參考樣例:
string input[]={"6","2","/","3","-","4","2","*","+"};
計算結果為:8