1. 程式人生 > >三種數學表示式以及字尾表示式的計算

三種數學表示式以及字尾表示式的計算

對於我們日常數學應用中最常用的中綴表示式,它其實是最複雜的一種計算方式,它增加了各種優先順序運算子等,使表示式不簡單;其實還有其他兩種數學表示式,字首表示式和字尾表示式。
它們的例項以及計算方式如下:
例項相關的中綴表示式:(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()

由於不考慮符號這樣的一元運算子,這裡的實現還是比較簡單的。如果要考慮一元運算子的話,那就比較複雜了,嗯~~~~~~~~~~~