中序表达式转换成后缀表达式

Posted acodingdg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中序表达式转换成后缀表达式相关的知识,希望对你有一定的参考价值。

很多笔试题都会问中序表达式转换成后缀表达式的方法

算法很固定,需要用到两个栈

想将表达式字符串转换成tokens,然后在从左向右遍历整个数组。

def reverse_polish_notation(expression:str):
    op_stack = []
    digit_stack = []
    expression = tokenize(expression)
    print(expression)
    for n in expression:
        if n.isdigit():
            digit_stack.append(n)
        elif n in "+-*/":
            while True:
                if len(op_stack) == 0 or op_stack[-1] == (:
                    op_stack.append(n)
                    break
                elif getValue(op_stack[-1]) < getValue(n):
                    op_stack.append(n)
                    break
                else:
                    op = op_stack.pop()
                    digit_stack.append(op)
        else:
            if n == (:
                op_stack.append(n)
            elif n == ):
                is_pair = False
                while len(op_stack) > 0:
                    op = op_stack.pop()
                    if op == (:
                        is_pair = True
                        break
                    else:
                        digit_stack.append(op)
                if not is_pair:
                    return []
    while len(op_stack) > 0:
        op = op_stack.pop()
        digit_stack.append(op)
    return digit_stack


def getValue(op:str):
    if op == * or op == /:
        return 2
    elif op == + or op == -:
        return 1
    return ord(op)
def tokenize(expression:str):
    res = []
    token = ""
    for i in range(len(expression)):
        if expression[i] in +-*/():
            if len(token) > 0 and token[0].isdigit():
                res.append(token)
                token = ""
            else:
                res.append(expression[i])
        else:
            token += expression[i]
    if token != "":
        res.append(token)
    return res
        

if __name__ == "__main__":
    res = reverse_polish_notation("1+((23+3)*4)-5")
    print("".join(res))

 

以上是关于中序表达式转换成后缀表达式的主要内容,如果未能解决你的问题,请参考以下文章

将中缀表达式转换成后缀表达式

C语言后缀表达式转换成中缀表达式

NOIP2016提高组初赛

二叉树的前序中序和后续遍历及应用场景

数据结构实验之栈与队列二:一般算术表达式转换成后缀式

中缀表达式转换成后缀表达式并求值