如果單詞是運算元,直接新增到字尾表示式列表的末尾『
如果單詞是左括號「(」,則壓入opstack棧頂
如果單詞是操作符「±/」,則需要壓入棧頂,但需要在壓入棧頂之前,比較此時棧頂操作符的優先順序,如果此時棧頂符號的優先順序大於該符號的優先順序,則先將此時的棧頂符號彈出棧頂,放到輸出列表末尾,執行這個操作直至棧頂符號的優先順序小於該符號,然後將該符號壓入棧頂,執行這個操作直至(如前乙個是「」,而後乙個是「+」,「」的優先順序大於「+」,則在壓入「+」之前,先將「」彈出)
如果單詞是右括號「)」,則,彈出棧頂操作符並放到輸出列表的末端,直至棧頂符號變為「(」(彈出扔掉)
from pythonds.basic.stack import stack
def infixtopostfix(infixexpr):
prec = {}
prec["("] = 1
prec[")"] = 1
prec["*"] = 3
prec["/"] = 3
prec["+"] = 2
prec["-"] = 2
opstack = stack()
postfixlist =
tokenlist = infixexpr.split()
for token in tokenlist:
if token in "abcdefghijklmnopqrstuvwxyz" or token in "1234567890":
elif token == "(":
opstack.push(token)
elif token == ")":
toptoken = opstack.pop()
while toptoken != "(":
toptoken = opstack.pop()
else:
while (not opstack.isempty()) and (prec[opstack.peek()]>=prec[token]):
opstack.push(token)
while not opstack.isempty():
return " ".join(postfixlist)
print(infixtopostfix('a + b * c'))
字尾轉中綴,並計算
from pythonds.basic.stack import stack
def infixtopostfix(infixexpr):
prec = {}
prec["("] = 1
prec[")"] = 1
prec["*"] = 3
prec["/"] = 3
prec["+"] = 2
prec["-"] = 2
opstack = stack()
postfixlist =
tokenlist = infixexpr.split()
for token in tokenlist:
if token in "abcdefghijklmnopqrstuvwxyz" or token in "1234567890":
elif token == "(":
opstack.push(token)
elif token == ")":
toptoken = opstack.pop()
while toptoken != "(":
toptoken = opstack.pop()
else:
while (not opstack.isempty()) and (prec[opstack.peek()]>=prec[token]):
opstack.push(token)
while not opstack.isempty():
return(" ".join(postfixlist))
def postfixtoinfix(postfixexpr):
opstack = stack()
tokenlist = postfixexpr.split()
for token in tokenlist:
if token in "abcdefghijklmnopqrstuvwxyz":
opstack.push(token)
elif token in "1234567890":
opstack.push(int(token))
else:
val2 = opstack.pop()
val1 = opstack.pop()
newtoken = domath(token, val1, val2)
opstack.push(newtoken)
return(opstack.pop())
def domath(op, val1, val2):
if op == "+":
return(val1 + val2)
elif op == "-":
return(val1 - val2)
elif op == "*":
return(val1 * val2)
else:
return(val1 / val2)
print(infixtopostfix('a + b * c'))
print(postfixtoinfix('2 3 5 * +'))
中綴轉字尾表示式
中綴轉字尾 進棧元素 進棧規則 若棧頂元素比目前元素的優先順序大或者相等,出棧 若棧頂元素與當前元素優先順序小,入棧 若當前元素為 入棧 若當前元素為 出棧頂元素直到遇到 位置,並且 不表達 遇到運算元直接表達 include include include define n 10 void fun...
中綴表示式轉字尾表示式
using system using system.collections.generic using system.text namespace 中綴表示式轉字尾表示式 class convert public void run top break case case while top 1 st...
中綴表示式轉字尾表示式
將乙個普通的中綴表示式轉換為字尾表示式的一般演算法是 首先需要分配2個棧,乙個作為臨時儲存運算子的棧s1 含乙個結束符號 乙個作為輸入字尾表示式的棧s2 空棧 s1棧可先放入優先順序最低的運算子 注意,中綴式應以此最低優先順序的運算子結束。可指定其他字元,不一定非 不可。從中綴式的左端開始取字元,逐...