注意:本文主要講解中綴轉后綴的轉換方法,因此本來的數字用小寫字母來表示。
式子的表示形式;
一般表達式(前綴表達式)比如 : a+b*c+(d+e)*f
后綴表達式 : abc*+de+f*+
為什么要轉換成為后綴表達式?
后綴式雖然我們看起來極其的麻煩,但是對於計算機來說可以非常高效地運算,計算機處理后綴表達式值時,遇見要處理的數字便壓入棧,若遇到運算符時取出棧頂的兩個元素,進行運算,得到的結果,再放入棧中,運算完成后棧中存的元素就是最終運算的結果。
怎么樣轉換以及轉換的具體代碼:
一、對於給出的中綴表達式從頭到尾進行遍歷
1.遇到字母直接輸出。
2.遇到 )直接輸出棧中的操作符直到( 為止,結束后再將 ( 也拋出棧。
3.若遇到運算符,只要棧頂的符號的優先級不低於當前的運算符,就不斷取出棧頂中的元素輸出出來,最后再將新符號進棧。(如果遇到 ’( ‘ 直接入棧)。
二、遍歷完成后,依次將棧中的元素輸出出來,直到棧為空為止。
讀者可以通過代碼來進一步理解:
1 #include<iostream> 2 #include<stack> 3 using namespace std; 4 5 stack<char>sta; 6 string s; 7 char ans[100]; 8 int cmp(char a,char b){ 9 if(b=='(' || a=='(')return 0; 10 else if((b=='*'||b=='/'||b=='%')&&(a=='+'||a=='-'))return 0; 11 else return 1; 12 } 13 int main(){ 14 int p=0; 15 cin>>s; 16 int len =s.size(); 17 for(int i=0;i<len ; i++){ 18 if(s[i]>='a'&&s[i]<='z')ans[p++]=s[i]; 19 else if(s[i]==')'){ 20 while(sta.top()!='('){ 21 char c = sta.top(); 22 sta.pop(); 23 ans[p++] = c; 24 } 25 sta.pop(); 26 } 27 else { 28 while(!sta.empty() && cmp(sta.top(),s[i])){ // 棧頂元素的優先級大於等於當前元素的優先級 29 char c =sta.top(); 30 sta.pop(); 31 ans[p++] = c; 32 } 33 sta.push(s[i]); 34 } 35 } 36 while(sta.size()){ 37 char c =sta.top(); 38 ans[p++] = c; 39 sta.pop(); 40 } 41 ans[p]='\n'; 42 cout<<ans<<endl; 43 return 0; 44 }