上篇文章介紹了 中綴表示式 轉 字尾表示式
這篇文章接著分享 計算字尾表示式的值
需求:求字尾表示式的值;
輸入:字尾表示式;
輸出:運算結果
from test05_stack.stack import stack
import re
defafter_opt_ret
(expr)
:# 運算元範圍
# expr_list = range(10000)
# 初始化乙個棧,用來儲存運算元
sk = stack(
)# 從前到後掃瞄運算元列表
for item in expr.split():
# 如果是運算元,直擊進棧
if re.match(r'\d+'
, item)
: sk.push(
int(item)
)# 如果是操作符,把棧中最上面的兩個數拿出來運算,把運算結果儲存到棧中
elif item in
"+-*/"
: expr02 = sk.pop(
) expr01 = sk.pop(
) ret = operate(item, expr01, expr02)
sk.push(ret)
# 取出棧中表示式的執行結果
# 返回表示式的運算結果
return sk.peek(
)def
operate
(opt, expr01, expr02)
:"""
兩個數運算,返回結果
:param opt: 操作符
:param expr01: 運算元1
:param expr02: 操作2
:return: 運算結果
"""if opt ==
"+":
return expr01 + expr02
elif opt ==
"-":
return expr01 - expr02
elif opt ==
"*":
return expr01 * expr02
elif opt ==
"/":
return expr01 / expr02
# 測試
print
(after_opt_ret(
"10 20 30 + +"))
print
(after_opt_ret(
"10 20 30 * +"))
# 測試結果
60610
中綴表示式轉字尾表示式 求字尾表示式值
中綴表示式轉字尾表示式 佇列q和棧s q存放字尾表示式結果 s存放操作符 設棧頂元素top 當前讀取元素a 演算法如果s是空棧 a入棧非空棧 a不是操作符,a插入佇列q 如果a為 a入棧 否則,如果a為 把棧內操作符出棧依次插入佇列q,直至遇到得 元素出棧為止 否則,如果a優先順序大於top,a入棧...
中綴表示式轉字尾表示式 求表示式的值
中綴轉字尾需要遵守以下規則 1 運算元 直接輸出 2 直接入棧 3 將 以前的直接輸出,並將 出棧 不輸出 4 運算子 將優先順序不小於該運算子的操作符出棧,最後將該運算子入棧 5 最後將棧中的元素依次彈出 6 優先順序 大於 大於 class intosuf if op i equals if o...
計算表示式值(字尾表示式) 棧
處理表示式主要是對優先順序以及括號的判斷 1.運算子棧頂的優先順序小於加入的時,需要將所有的不評級的取出並計算,2.當遇到 時,需要括號內的運算全部處理 2.其他情況全部加入運算子棧和資料棧 include include include using namespace std typedef lo...