四則運算運算式求值(棧的應用)

來源:互聯網
上載者:User

1.前/中/尾碼運算式的轉換(首先需要明白三者之間的轉換)  

   自然運算式轉換為前/中/尾碼運算式,其實是很簡單的。首先將自然運算式按照優先順序順序,構造出與運算式相對應的二叉樹,然後對二叉樹進行前/中/尾碼遍曆,即得到前/中/尾碼運算式。    舉例說明將自然運算式轉換成二叉樹:    a×(b+c)-d    ① 根據運算式的優先順序順序,首先計算(b+c),形成二叉樹         ②然後是a×(b+c),在寫時注意左右的位置關係
      ③最後在右邊加上 -d       然後最這個構造好的二叉樹進行遍曆,三種遍曆的順序分別是這樣的:    ① 前序走訪:根-左-右   ② 中序遍曆:左-根-右
   ③ 後序遍曆:左-右-根
    所以還是以剛才的這個例子,在最終二叉樹的基礎上可以得出:    首碼運算式:-*a+bcd    中綴運算式:a*b+c-d    尾碼運算式:abc+*d-2.中綴運算式轉尾碼運算式(棧的應用)   中綴運算式“9+(3-1)*3+10/2”轉化為尾碼運算式為“9 3 1- 3 * + 10 2 / +”.

   規則:從左至右遍曆中綴運算式的每一數字和符號,若是數字就輸出,即成為尾碼運算式的一部分;若是符號,則判斷其與棧  頂符號的優先順序,是右括弧或優先順序低於棧頂符號(乘除優先加減)則棧頂元素依次出棧並輸出,並將當前符號進棧,一直到最終輸出尾碼運算式為止。

    a.初始化一空棧,用來對符號進出棧使用。

    b.第一個字元是數字9,輸出9,後面是符號“+”,進棧。

    c.第三個字元是“(”,依然是符號,因其只是左括弧,還沒有配對,故進棧。

    d.第四個字元是數字3,輸出,總運算式為9 3,接著是“-”,進棧。

    e.接下來是數字1,輸出,總運算式為9 3 1,後面是符號“)”,此時,我們需要去匹配此前的“(”,所以棧頂依次出棧,並輸出,直到“(”出棧為止。此時左括弧上方只有“-”,因此輸出“-”。總的運算式為9
3 1 -。

    f.接著是數字3,輸出,總的運算式為9 3 1 - 3.緊接著是符號“*”,因為此時的棧頂符號為“+”號,優先順序低於“*”,因此不輸出,“*”進棧。

    g.之後是符號“+”,此時當前棧頂元素“*”比這個“+”的優先順序高,因此棧中元素出棧並輸出(沒有比“+”更低的優先順序,所以全部出棧),總輸出運算式為9 3 1 - 3 *
+。然後將當前這個符號“+”進棧。

    h.緊接著數字10,輸出,總運算式為9 3 1 - 3 * + 10。後是符號“/”,所以“/”進棧。

    i.最後一個數字2,輸出,總的運算式為9 3 1 - 3 * + 10 2。

    j.因已經到最後,所以將棧中符號全部出棧並輸出。最終輸出的尾碼運算式結果為9 3 1 - 3 * + 10 2 / +。

3.尾碼運算式計算結果(棧的應用)

   尾碼運算式為:9 3 1 - 3 * + 10 2 / +

   規則為:從左至右遍曆運算式的每個數字和符號,遇到是數字就進棧,遇到是符號,就將處於棧頂兩個數字出棧,進行運算,運算結果進棧,一直到最終獲得結果。

   a.初始化一個空棧。此棧用來對要運算的數字進行進出使用。

   b.尾碼運算式中前三個是、都是數字,所以9 3 1 進棧。

   c.接下來是“-”,所以將棧中的1出棧作為減數,3出棧作為被減數,並運算3-1得到2,再講2進棧。

   d.接著是數字3進棧。

   e.後面是“*”,也就意味著棧中3和2出棧,2與3相乘,得到6,並將6進棧。

   f.下面是“+”,所以棧中6和9出棧,9和6相加,得到15,將15進棧。

   g.接著是10和2兩數字進棧。

   h.接下來是符號“/”,因此,棧頂的2與10出棧,10與2相除,得到5,將5進棧。

   i.最後一個是符號“+”,所以15與5出棧並相加,得到20,講20進棧。

   j.結果是20出棧,棧變為空白。

 

 

//下面的代碼只是支援一些簡單的整數的加減乘除運算,而且不支援浮點數,負數或者數字大於9的數位運算,只是//自己簡單的寫一個代碼,將這個過程進行的簡單驗證,如果需要解決複雜的計算問題,可以上網尋找資料來實現! #include<iostream>#include<cstdio>#include<string>#include<stack>using namespace std;stack<char> s; stack<int> ss; int main(){    int len1, len2, len, i, j;    string str1, str2;//str1為中綴運算式,str2為尾碼運算式     while (1){          //中綴運算式轉換為尾碼運算式           getline(cin, str1);          len1 = str1.length();          str2.clear();           for (i = 0; i < len1; i++){              if (str1[i] >= '0' && str1[i] <= '9')                  str2.push_back(str1[i]);              else{                   if (s.size() == 0 || str1[i] == '(')                       s.push(str1[i]);                   else{                        char tmp1 = s.top();                        if (str1[i] == ')'){                            len = s.size();                            while (len){                                 char tmp = s.top();                                 s.pop();                                if (tmp == '(')                                    break;                                else                                     str2.push_back(tmp);                                 len--;                             }                         }                         else{                             if (tmp1 == '*' || tmp1 == '/'){                                 if (str1[i] == '*' || str1[i] == '/')                                      s.push(str1[i]);                                 else{                                      len = s.size();                                       while (len){                                          char tmp = s.top();                                           str2.push_back(tmp);                                          s.pop();                                           len--;                                       }                                      s.push(str1[i]);                                   }                              }                              else{                                  s.push(str1[i]);                              }                         }                    }                }           }          if (s.size() != 0){              len = s.size();               while (len){                  char tmp = s.top();                   str2.push_back(tmp);                  s.pop();                   len--;               }           }           cout << str2 << endl;          //由尾碼運算式計算結果           int temp1, temp2, temp3;           len2 = str2.length();          for (i = 0; i < len2; i++){              if (str2[i] >= '0' && str2[i] <= '9'){                   int t = str2[i]-48;                   ss.push(t);               }               else{                   temp1 = ss.top();                   ss.pop();                   temp2 = ss.top();                   ss.pop();                    if (str2[i] == '+'){                       temp3 = temp2 + temp1;                    }                   else if (str2[i] == '-'){                        temp3 = temp2 - temp1;                    }                   else if (str2[i] == '*'){                        temp3 = temp2 * temp1;                    }                   else if (str2[i] == '/'){                        temp3 = temp2 / temp1;                    }                   ss.push(temp3);               }          }          cout << ss.top() << endl;     }         system("pause");}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.