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

2021-08-30 04:37:09 字數 968 閱讀 2627

由於中綴表示式有括號的存在,其運算次序比較複雜,直接分析有些難度。先考慮不帶括號的中綴表示式的轉換。

由於運算符號具有不同的優先順序,當前的運算子不能直接放在運算元的後面,需要考慮下乙個運算子的優先順序。

對比三個不同的中綴表示式轉換為字尾表示式的結果

可以發現:

1.字尾表示式數字的出現順序和中綴表示式中是完全一樣的。

2.中綴表示式中相鄰兩個運算子的優先順序不一樣,其在字尾表示式中的位置也不一樣。其規則是,如果當前運算子優先順序大於等於下個運算子優先順序,將該運算子寫後運算元後面。否則記下該運算子,在之後寫上。

可以利用棧後進先出的特點來臨時存運算符號,用乙個列表存字尾表示式的結果。以

為例,演示轉換的思路:

對於帶有括號的中綴表示式的轉換,個人理解應該將兩括號之間的部分看做乙個整體。遇到 ( 應壓入棧,在他之後的運算子同樣按照上圖所示規則壓入棧,直到遇到 ),表示該部分結束,應該棧裡 ( 上面的所有運算子彈出。

def tokens(exp):

"""生成器函式。將輸入的中綴表示式拆成乙個個的項返回。但不能處理一元運算子和負數"""

operators="+-*/()"

i,n=0,len(exp)

while i=n or exp[i+1]==" " or exp[i+1] in operators: #數字後結束,或者是空格或運算子,直接加入

yield exp[i]

i+=1

continue

j=iwhile i+1測試結果:

輸入表示式:

5*3*(4+6*7)*(1+1)

['5', '3', '*', '4', '6', '7', '*', '+', '*', '1', '1', '+', '*']

棧應用之中綴表示式轉字尾表示式(C語言)

我從網上摘取了幾個思路,這裡的思路在優先順序的比較上大致相同,方法多變,這裡不再一一詳解。1 數字直接輸出 2 遇到左括號直接入棧,遇到右括號將棧中左括號之 棧的運算子全部彈棧輸出,同時左括號出棧但是不輸出。3 遇到乘號和除號直接入棧,直到遇到優先順序比它更低的運算子,依次彈棧。4 遇到加號和減號,...

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

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

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

中綴表示式 字尾表示式,都是用來呈現運算表示式的一種方式。標準表示式 4 5 6 7 中綴表示式,就是標準的表示式,即4 5 6 7 字尾表示式,符號在後的表示式,即4 5 6 7 中綴表示式轉字尾表示式的思想是 注意的是 只有 這5種符號才會入棧 1.讀到運算元時,立即輸出 2.讀到的是操作符,分...