中綴表示式轉字尾表示式思路:三個方法: ① 將中綴表示式轉換成 中綴表示式對應的 list ② 自定義運算子優先順序 ? 將中綴表示式對應的 list 轉換成 字尾表示式.
1.1 使用 list 更好的和 stack 配合,list 比 字串的遍歷更加靈活.
將中綴表示式對應的 list 轉換成 字尾表示式
2.1 需要兩個棧: 運算子棧 s1、儲存臨時結果棧(為了方便使用
list
代替stack
) s22.2 遍歷 中綴list
2.3 判斷是否為數字、( 、) 、運算子
2.3.1 如果是數字: 直接壓入 s2
2.3.2 如果是 ( : 直接壓入 s1
2.3.3 如果是 ) : 將棧 s1 中 『(』 以上的運算子彈出,壓入 s2 ,然後消去 (
2.3.4 如果是運算子:
2.3.4.1 當前棧為空 或者 棧頂為 ( : 直接壓入 s1
2.3.4.2 當前運算子優先順序 大於 棧頂的運算子優先順序, 直接壓人 s1
2.3.4.3 當前運算子優先順序 小於 棧頂的優先順序, 將棧頂運算子彈出,壓入 s2。 重複上訴 2.3.4.1 和 2.3.4.2 的判斷。
2.4 中綴 list 遍歷完後,將 s1 中剩餘的運算子依次彈出,壓入到 s2 中.
2.5 如果 s2 使用的
stack
,還需要將結果逆序輸出.* 將中綴表示式轉換成字尾表示式
*/@test
public
void
tosuffixexpression()
/** * 將 中綴表示式轉成對應的 list
*/public
static list
toinsuffixstringlist
(string str)
else
} list.
add(s);}
else
}return list;
}/**
* 將 中綴表示式對應的list 轉換成 字尾表示式
*/public
static list
getsuffixexpression
(list
list)
elseif(
"(".
equals
(c))
elseif(
")".
equals
(c))
// 然後再將 ( 消除
s1.pop();
}else
// 再將當前符號壓入 s1
// 或:
// 1. 當前運算子優先順序 大於 棧頂運算子
// 2. 當前棧頂為 (
s1.push
(c);}}
// 最後將s1中剩餘的按序彈出壓入到 s2 中
while
(!s1.
empty()
)// 如果s2是stack,還需要逆序結果
return s2;
}/**
* 運算子優先順序
*/static
class
operation
else
if(c.
equals
("-"))
else
if(c.
equals
("*"))
else
if(c.
equals
("/"))
else
return0;
}}
中綴表示式轉換成字尾表示式
一 基礎知識 中綴表示式 人們常用的表示式就叫做中綴表示式,如a b c d 字尾表示式 又叫做逆波蘭表示式,由一名波蘭數學家提出,方便進棧操作 字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字...
中綴表示式轉換成字尾表示式
優先順序 如果輸入運算子的優先順序低於或等於棧頂的操作符優先順序,則棧內元素進入輸入佇列,輸入運算子入棧。乙個簡單的例子 演算法示意圖,使用了3個空間。輸入用符號代替,如果輸入是乙個數字則直接進輸出佇列,即圖中 b d f h 如果輸入是運算子,則壓入操作符堆疊,即圖中 c e 但是,如果輸入運算子...
中綴表示式轉換成字尾表示式 棧
字尾表示式嚴格按照從左到右進行計算的模式,符合計算機執行方式,而中綴表示式需要計算機遇到符號後向後掃瞄一位,若為括號或優先順序更高的操作符還需要向後繼續掃瞄。設我們欲將中綴表示式 a b c d e f g轉換成字尾表示式,正確的答案為 abc de f g 當我們讀入運算元的時候,立即將其放入到輸...