中缀表达式转后缀表达式并计算

Posted 除了心跳都忘掉

tags:

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

中缀表达式转换为后缀表达式的算法

  1. 初始化一个空的后缀表达式和一个空的栈。
  2. 从左到右扫描中缀表达式。
  3. 遇到一个运算数的时候,将其添加到后缀表达式的后面。
  4. 遇到一个左括号的时候,将其压入栈中。
  5. 遇到一个运算符,从栈中弹出和它具有相等的或更高优先级的所有运算符,将它们添加到后缀表达式的末尾,然后,将扫描到的运算符压入栈中
  6. 遇到一个右括号的时候,将运算符从栈中弹出并添加到后缀表达式中,直到遇到了与之匹配的左括号,并将其(两个括号)丢弃。
  7. 遇到中缀表达式结束的时候,将栈中剩下的运算符都转移到后缀表达式之中。

计算后缀表达式

  1. 从左到右地遍历表达式
  2. 遇到一个运算符的时候,对之前的两个运算数应用该运算符,并且用结果替换这两个运算数和这个运算符。
  3. 继续遍历,直到到达了表达式的末尾,此时,只剩下了表达式的值。

三个函数
1.stringToList()
将输入的字符串转化为列表;

'33-15*6'
转化为
['33', '-', '15', '*', '6']	

2.infixToSuffix()
中缀表达式转为后缀表达式;

['33', '-', '15', '*', '6']
转化为
['33', '15', '6', '*', '-']

3.calcuSuffix()
计算后缀表达式;


易错点
1.stringToList()中,
我的思想是在遇到一个非数字的字符时就将 tempL 加入到 result 并将其清空;
这里要注意表达式的最后可能不是非数字字符,即最后一遍的时候 tempL 可能不会执行添加到 result 中的操作,所以在循环结束后还要检查如果 tempL 不为空,就要将它加入到 result 中。
2.infixToSuffix()中,
在每次使用peek()探查栈顶元素时,应先判断栈是否为空。否则会引发异常。


代码

from linkedstack import LinkedStack


def stringToList(exp):
    tempL = []
    result = []
    for ch in exp:
        if str(ch).isdigit():
            tempL.append(ch)
        else:
            if tempL:
                result.append(''.join(tempL))
                tempL.clear()
            result.append(ch)
    if tempL:
        result.append(''.join(tempL))
    return result


def infixToSuffix(lyst):
    suffix = []
    stk = LinkedStack()
    for token in lyst:
        if str(token).isdigit():
            suffix.append(token)
        else:
            if token in ['(', '[']:
                stk.push(token)
            elif token in [')', ']']:
                top = stk.peek()
                while not top in ['(', '[']:
                    suffix.append(top)
                    stk.pop()
                    top = stk.peek()
                stk.pop()
            else:
                if stk.isEmpty():
                    stk.push(token)
                elif token in ['+', '-']:
                    top = stk.peek()
                    while top in ['+', '-', '*', '/']:
                        suffix.append(top)
                        stk.pop()
                        if stk.isEmpty():
                            break
                        else:
                            top = stk.peek()
                    stk.push(token)
                elif token in ['*', '/']:
                    top = stk.peek()
                    while top in ['*', '/']:
                        suffix.append(top)
                        stk.pop()
                        if stk.isEmpty():
                            break
                        else:
                            top = stk.peek()
                    stk.push(token)
    while not stk.isEmpty():
        suffix.append(stk.pop())
    return suffix


def calcuSuffix(lyst):
    # every element in lyst should be a string.

    tempS = ''
    while len(lyst) != 1:
        for i in range(len(lyst)):
            if lyst[i] in ['+', '-', '*', '/']:
                tempS += lyst[i - 2] + lyst[i] + lyst[i - 1]
                lyst[i - 2] = str(eval(tempS))
                tempS = ''
                for j in range(i - 1, len(lyst) - 2):
                    lyst[j] = lyst[j + 2]
                del lyst[-1:-3:-1]
                break
    return lyst[0]


def main():
    while True:
        st = input('Input an arithmetic expression:\\n')

        if st == 'exit':
            break

        lyst = stringToList(st)
        suff = infixToSuffix(lyst)
        result = calcuSuffix(suff)
        print('Suffix expression of it is:', suff, sep='\\n')
        print('Result of the expression:', result, sep='\\n')


if __name__ == '__main__':
    main()

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

Java中缀表达式转后缀表达式并计算后缀表达式的值

堆栈入门-简单计算器模板-中缀转后缀

数据结构之栈—强大的四则复杂运算计算器(媲美windows自带的科学计算器)中缀转后缀表达式

中缀式转后缀式求表达式结果

java简易计算机(用栈实现中缀转后缀,计算后缀表达式)

每天进步一点点之中缀表达式转后缀表达式