棧應用 中綴表示式轉字尾表示式求值

2021-10-07 07:43:47 字數 2148 閱讀 9809

(或中綴記法)是乙個通用的算術或邏輯公式表示方法, 操作符是以中綴形式處於運算元的中間(例:3 + 4),中綴表示式是人們常用的算術表示方法。與字首表示式(例:+ 3 4)或字尾表示式(例:3 4 +)相比,中綴表示式不容易被計算機解析,但仍被許多程式語言使用,因為它符合人們的普遍用法。

確實,中綴表示式很符合人類的思想,但是讓計算機理解起來卻不那麼容易,這裡我們引進了字尾表示式

乙個表示式e的字尾形式可以如下定義:

(1)如果e是乙個變數或常量,則e的字尾式是e本身。

(2)如果e是e1 op e2形式的表示式,這裡op是任何二元操作符,則e的字尾式為e1'e2' op,這裡e1'和e2'分別為e1和e2的字尾式。

(3)如果e是(e1)形式的表示式,則e1的字尾式就是e的字尾式。

為了解釋字尾表示式的好處,我們先來看看,計算機如何應用字尾表示式計算出9+(3-1)×3+10 ÷ 2=20的 ,轉化為字尾表示式為9 3 1 - 3 × + 10 2 ÷+

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

這個是相對簡單的,最複雜的莫過於中綴轉字尾了,細節很多。

規則

從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,即成為字尾表示式的一部分;若是符號,則判斷其與棧頂符號的優先順序,是右括號或者優先順序不高於棧頂符號(乘除優先加減)

則棧頂元素依次出棧並輸出,並將當前符號進棧,一直到最終輸出字尾表示式為止

以9+(3-1)×3+10 ÷ 2轉為字尾表示式" 9 3 1 - 3 × + 10 2 ÷+"為例

1.初始化一空棧,用來對符號進出棧使用,如下

2.第乙個字元是數字9,輸出9,後面是符號』+』,進棧。

3.第三個字元是" (",依然是符號,因為是左括號,還未配對,故進棧。

4.第四個字元是數字3,輸出,總表示式為9 3 ,接著是』』 - 『』,進棧

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

6.緊接著是符號』』 × 『』 ,因為此時的棧頂符號為』』 + 「號,優先順序低於乘號,因此不輸出,」 * "進棧,接著是數字3,輸出,總表示式為9 3 1 -3

7.之後是符號』』 + ",此時當前棧頂元素』』 * 『『比這個』』 + "優先順序高,因此棧中元素出棧並輸出(已經全部出棧,棧空),總輸出表示式為9 3 1 -3 * +。然後將當前的』』 + "進棧。緊接著數字10,輸出,總表示式為9 3 1 - 3 * + 10.後是符號

『』 ÷ 『』,所以』』 / ''進棧。最後乙個數字2,輸出,總表示式為9 3 1 - 3 * + 10 2

8.因為已經處理完了,所以需要將棧中符號全部出棧並輸出。最終輸出的字尾表示式為 9 3 1 - 3 * + 10 2 / +

相應題目

洛谷p1981

acwing151

棧 中綴表示式轉字尾表示式

中綴轉字尾的演算法 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進棧 運算符號 與棧頂符號進行優先比較 若棧頂符號優先順序低 此符號進棧 預設棧頂若是左括號,則左括號的優先順序最低 若棧頂符號優先順序高 將棧頂符號彈出 並輸出 直到棧頂的符號優先順序低,然後進棧 右括號 將棧...

中綴表示式轉字尾表示式 求字尾表示式值

中綴表示式轉字尾表示式 佇列q和棧s q存放字尾表示式結果 s存放操作符 設棧頂元素top 當前讀取元素a 演算法如果s是空棧 a入棧非空棧 a不是操作符,a插入佇列q 如果a為 a入棧 否則,如果a為 把棧內操作符出棧依次插入佇列q,直至遇到得 元素出棧為止 否則,如果a優先順序大於top,a入棧...

棧的應用 中綴表示式轉字尾表示式

有關棧api詳情請參看我的另一篇博文 棧的鏈式儲存 api實現 例項 5 4 5 4 1 2 3 1 2 3 8 3 1 5 8 3 1 5 中綴表示式符合人類的閱讀和思維習慣 字尾表示式符合計算機的 運算習慣 中綴轉字尾演算法 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進...