表达式转换:中缀转后缀

表达式转换:中缀转后缀----算法流程

如果单词是操作数,直接添加到后缀表达式列表的末尾‘
如果单词是左括号“(”,则压入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 * +'))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值