目的:將中綴表示式(即標準形式的表示式)轉換為字尾式。
例子:a+b*c+(d*e+f)*g轉換成abc*+de*f+g*+
轉換原則:
1.當讀到乙個運算元時,立即將它放到輸出中。操作符則不立即輸出,放入棧中。遇到左圓括號也推入棧中。
2.如果遇到乙個右括號,那麼就將棧元素彈出,將符號寫出直到遇到乙個對應的左括號。但是這個左括號只被彈出,並不輸出。
3.在讀到操作符時,如果此時棧頂操作符優先性大於或等於此操作符,彈出棧頂操作符直到發現優先順序更低的元素位置。除了處理)的時候,否則決不從棧中移走"("。操作符中,+-優先順序最低,()優先順序最高。
4.如果讀到輸入的末尾,將棧元素彈出直到該棧變成空棧,將符號寫到輸出中。
解如下:
首先,讀入a,並送到輸出,然後+被讀入並壓入棧中。接下來b讀入並送到輸出,此時狀態如下:
stack: 輸出:a b
+back top
接下來讀入*,由於優先性比棧頂元素+大(原則3),因此被壓入棧頂,接著讀入c,並送到輸出:
stack: 輸出:a b c
+ *back top
然後讀入+,由於此時棧頂元素為*,優先順序比+大,因此將*彈出,彈出後原來的+變成棧頂元素,由於+的優先性和當前讀入的+優先性相等,因此也被彈出(原則3),最後將讀入的+壓入棧中。因此此時狀態如下:
stack: 輸出:a b c * +
+back top
下乙個讀入的符號是(,由於具有最高優先順序,因此將其放入棧中,然後讀入d:
stack: 輸出:a b c * + d
+ (back top
繼續讀入,此時讀入*,除非處理),否則(決不彈出(原則3),因此*被壓入棧中,接下來讀入e,並送到輸出:
stack: 輸出:a b c * + d e
+ ( *
back top
再往後讀入的符號是+,將*彈出並輸出。(原則3,與之前步驟相似),然後將+壓入棧中,接著讀入f並送到輸出:
stack: 輸出:a b c * + d e * f
+ ( +
back top
現在讀入),因此彈出棧元素直到遇到「(」(原則2):
stack: 輸出: a b c * + d e * f +
+back top
下面又讀入乙個*,被壓入棧中,然後讀入g並輸出:
stack: 輸出: a b c * + d e * f + g
+ *back top
現在輸入為空,彈出棧中所有元素:
stack : 輸出: a b c * + d e * f + g * +
empty
自此全部完成。(總結自資料結構與演算法導論c++版第三版)
將中綴表示式轉換成字尾表示式
我們人腦很容易理解中綴表示式,但是中綴表示式在計算機並不好計算,所有我們要將中綴表示式轉換成字尾表示式,因為字尾表示式是很容易計算的。為什麼要寫乙個這樣的程式呢?原因是我一開始想寫乙個計算機,它能夠將輸入的表示式的值計算出來。一開始覺得這樣子的程式應該是很簡單的,然後開始動手寫,開始寫了之後才發現並...
中綴表示式轉換成字尾表示式 棧
字尾表示式嚴格按照從左到右進行計算的模式,符合計算機執行方式,而中綴表示式需要計算機遇到符號後向後掃瞄一位,若為括號或優先順序更高的操作符還需要向後繼續掃瞄。設我們欲將中綴表示式 a b c d e f g轉換成字尾表示式,正確的答案為 abc de f g 當我們讀入運算元的時候,立即將其放入到輸...
中綴表示式轉換成字尾表示式
一 基礎知識 中綴表示式 人們常用的表示式就叫做中綴表示式,如a b c d 字尾表示式 又叫做逆波蘭表示式,由一名波蘭數學家提出,方便進棧操作 字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字...