模擬一般數學表達式(中綴式)轉換為后綴表達式


       注意:本文主要講解中綴轉后綴的轉換方法,因此本來的數字用小寫字母來表示。

式子的表示形式;

  一般表達式(前綴表達式)比如  : 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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM