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

2021-09-29 17:46:42 字數 2833 閱讀 7966

中綴表示式是我們經常接觸的算術表示式,如(a+b)* c,a * (c - d)等,優點是便於記憶,缺點是對運算順序有嚴格的要求。字尾表示式又稱逆波蘭式,如abc*+d e *f+g*+,雖然不便記憶,但是它不像中綴表示式,對於運算的順序是沒有要求,可以按照順序掃瞄的方法計算表示式,因此在計算機內部容易用程式設計的方式實現表示式的求值。

# !/usr/bin/python

# coding=utf-8

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

# input: 中綴表示式

# output: 字尾表示式

def infix_to_suffix(inf):

stack =

suf = ""

pt = i = -1

slen = len(inf) - 1

# opt_dict =

while i < slen:

i += 1

char = inf[i]

if char not in opt_dict.keys():

suf += char.strip()

continue

# pop element util find '(' which should also be pop from stack

if char == ")":

while pt >= 0:

if stack[pt] == "(":

del stack[pt]

pt = pt - 1

break

suf += stack[pt]

del stack[pt]

pt = pt - 1

continue

# pop element whose level less than pri (priority)

# obviously, if is '(', 'break' make effect instantly

pri = opt_dict[char]

while pt >= 0:

if opt_dict[stack[pt]] < pri or stack[pt] == '(':

break

suf += stack[pt]

del stack[pt]

pt = pt - 1

pt += 1

# output remainder of stack if possible

suf += "".join(stack)

return suf

def main():

inf = "a+b*c+(d*e+f)*g"

#inf = "a+b*c+(d*e+f)"

#inf = "(a+b)*(c*(d+e))"

suf = infix_to_suffix(inf)

print(suf)

if __name__ == '__main__':

main()

幾點說明

stack是乙個列表,用來模擬棧,pt 指示棧頂;

不同運算子的優先順序不同,相應的操作亦不同,詳見注釋;

suf 表示最終輸出的字尾表示式;

跳過空格,所以需要呼叫strip();

為方便起見,僅將「+,-,*,/」四種運算子和「()」考慮在內;

字尾轉中綴相對比較簡單。大致過程為:初始化乙個空棧,然後順序掃瞄表示式,如果不是運算子則壓棧,否則從棧中相繼彈出兩個元素通過運算子做運算,並將運算後的表示式壓棧。

# !/usr/bin/python

# coding=utf-8

# 字尾轉中綴

# input: 字尾表示式

# output: 中綴表示式

def suffix_to_infix(suf):

opt_lst = ['+','-','*','/']

i = p = -1

explen = len(exp) - 1

stack =

while i < explen:

i += 1

if exp[i] == ' ':

continue

if exp[i] in opt_lst:

# pop stack[p] and stack[p-1]

e1 = stack[p]

del stack[p]

p = p - 1

e2 = stack[p]

del stack[p]

p = p - 1

if exp[i] == "+" or exp[i] == "-":

e = str("(" + e2 + exp[i] + e1 + ")")

else:

e = str(e2 + exp[i] + e1)

p += 1

else:

# push to stack top

p += 1

return stack[0]

def main():

#suf = "ab+cde+**"

suf = "abc*+de*f+g*+"

inf = suffix_to_infix(suf)

print(inf)

if __name__ == '__main__':

main()

說明:當發現「+,-」運算子時,對彈出的兩個元素做運算後需要加上"()",這是為了保持原有的中綴表示式的運算優先順序。可能會加一些多於的"()",但是運算不至於出錯,此處可以優化,只是為了演示棧的應用沒有實現。

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

有關棧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.讀到的是操作符,分...

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

中綴轉字尾過程 1.對於數字 直接輸出 2.對於符號 2.1 左括號 進棧 2.2 運算符號 與棧頂符號進行優先順序比較,若棧頂符號優先順序低 此符號進棧 若棧頂符號優先順序不低 將棧頂符號彈出並輸出,之後進棧 若是乘除直接進棧 若是加減,與棧頂比較,若棧頂是乘除,直接輸出,否則進棧。2.3 右括號...