三种数学表达式以及后缀表达式的计算

对于我们日常数学应用中最常用的中缀表达式,它其实是最复杂的一种计算方式,它增加了各种优先级运算符等,使表达式不简单;其实还有其他两种数学表达式,前缀表达式和后缀表达式。
它们的实例以及计算方式如下:
实例相关的中缀表达式:(3 - 5)* (6 + 17 * 4) / 3

  • 前缀表达式:
    实例:/ * - 3 5 + 6 * 17 4 3
    计算方式:前缀表达式由右往左就算,每次遇到运算符就取离该运算符最进的两个数进行运算符计算然后将结果填入计算后的位置。
  • 后缀表达式:
    实例:3 5 - 6 17 4 * + * 3 /
    计算方式:后缀表达式从左往右计算, 每次遇到运算符就取离该运算符最近的两个数进行运算符计算,然后填入

知道了计算方式,我们来讲一下如何用python实现后缀表达式的计算。

我们用栈的方式实现对后缀表达式的计算,遇到数字就压入栈,遇到运算符就取出栈顶两个数进行运算符运算并且将结果压入栈中。

为此,我们要为之前顺序表实现栈的代码中加入一个方法,取出栈顶两个元素,如下代码:

def getFirstTwo(self):
        if len(self._elem) < 2:
            raise StackOverFlow("栈中少于两个元素")
        return self._elem.pop(), self._elem.pop()
# 返回的元素就是栈顶的两个元素

具体的实现方法如下:

# _*_ coding: utf-8 _*_

from 栈的顺序表实现 import Stack

S = Stack()
# 创建一个用于存储数的栈

def suffix_exp_cul(suffixExpression):
    a = suffixExpression.split(' ')
    # 由于我们输入的是一个字符串,而且字符串的每个符号之间都有空格
    for i in a:
        try:
            num = int(i)
            S.push(num)
        except ValueError:
            culNums = S.getFirstTwo()
            x, y = culNums[1], culNums[0]
            if i == '/':
                newNum = x / y
            elif i == '*':
                newNum = x * y
            elif i == '+':
                newNum = x + y
            else:
                newNum = x - y
            S.push(newNum)
        continue
    if S.is_empty():
        return newNum
    else:
        raise ValueError
       # 如果结束时栈不为空,说明输入的后缀表达式有问题

def suffix_exp_calculate():
# 定义一个交互环境,用于输入后缀表达式
    x = 1
    while True:
        try:
            if x == 1:
                line = input("请输入您要计算的后缀表达式(每个字符中间留空格)(按done退出):")
                x = 2
            else:
                line = input("输入有误,请重新输入您要计算的后缀表达式(每个字符中间留空格)(按done退出):")
            if line == 'done':
                break
            end = suffix_exp_cul(line)
            print("你的表达式结果为:", end)
        except ValueError:
            continue
        
suffix_exp_calculate()

由于不考虑符号这样的一元运算符,这里的实现还是比较简单的。如果要考虑一元运算符的话,那就比较复杂了,嗯~~~~~~~~~~~

你可能感兴趣的:(三种数学表达式以及后缀表达式的计算)