表示式轉換 中綴轉字尾

2021-09-29 03:02:36 字數 2724 閱讀 7927

如果單詞是運算元,直接新增到字尾表示式列表的末尾『

如果單詞是左括號「(」,則壓入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棧可先放入優先順序最低的運算子 注意,中綴式應以此最低優先順序的運算子結束。可指定其他字元,不一定非 不可。從中綴式的左端開始取字元,逐...