表达式转换:中缀转后缀----算法流程
如果单词是操作数,直接添加到后缀表达式列表的末尾‘
如果单词是左括号“(”,则压入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":
postfixList.append(token)
elif token == "(":
opStack.push(token)
elif token == ")":
topToken = opStack.pop()
while topToken != "(":
postfixList.append(topToken)
topToken = opStack.pop()
else:
while (not opStack.isEmpty()) and (prec[opStack.peek()]>=prec[token]):
postfixList.append(opStack.pop())
opStack.push(token)
while not opStack.isEmpty():
postfixList.append(opStack.pop())
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":
postfixList.append(token)
elif token == "(":
opStack.push(token)
elif token == ")":
topToken = opStack.pop()
while topToken != "(":
postfixList.append(topToken)
topToken = opStack.pop()
else:
while (not opStack.isEmpty()) and (prec[opStack.peek()]>=prec[token]):
postfixList.append(opStack.pop())
opStack.push(token)
while not opStack.isEmpty():
postfixList.append(opStack.pop())
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 * +'))