Python 棧 四則運算

2021-09-02 08:14:58 字數 2327 閱讀 3399

首先了解一下棧:

棧是限定僅在表尾進行插入和刪除操作的線性表。允許插入與刪除的一段叫做棧頂,另一端

叫做棧底,不含任何資料元素的棧稱為空棧。棧又稱為後進先出(last in first out)的線性

表,簡稱lifo結構。

在python中,可以用列表來實現棧:

lt = [3]

#相當於壓棧

print(lt)

>>>[3,4]

#相當於彈棧

lt.pop()

print(lt)

>>>[3]

利用棧這種資料結構我們可以實現四則運算。首先,我們來了解一些名詞:

中綴表示式:我們再平常寫的四則運算表示式就叫做中綴表示式,運算子位於數字中間,例如:

9+3*(2+1)

字尾表示式:將運算子寫到數字後面的式子叫做字尾表示式,對於上面的例子來說:

中綴表示式轉為字尾表示式思路9+3*(2+1):

設立乙個運算子棧和字尾表示式棧;

第乙個元素為數字9,加入字尾表示式棧:9;

第二個元素為運算子「 + 」,加入到運算子棧:+;

第三個元素為數字3,字尾表示式棧:9 3;

第四個元素為運算子「 * 」,由於 「 * 」 的優先順序大於棧頂元素 +,所以將其加入到運算子棧中:+ *;

第五個元素為「 ( 」,加入到運算子棧中:+ * (;

第六個元素為數字2,字尾表示式棧:9 3 2;

第七個元素為運算子「 + 」,加入到運算子棧:+ * ( +;

第八個元素為數字1,字尾表示式棧:9 3 2 1;

第九個元素為「 ) 」,並且由於這是最後乙個元素,運算子棧開始彈出,並

加入到字尾表示式棧中:9 3 2 1 + * +

字尾表示式寫出來後,又該怎樣去計算呢?我們可以發現,當遍歷字尾表示式時,可以將數字元素加入到乙個新棧,然後遇到乙個運算子就彈出兩個數字進行運算,將值壓棧,直到最後乙個元素為止,這樣新棧中的值就是運算結果.

**:

# 轉為字尾表示式.運算表示式元素之間用空格隔開:

def change_houzhui(s):

result = # 結果列表

stack = # 棧

s_lt = s.split(' ')

for item in s_lt:

if item.isnumeric(): # 如果當前字元為數字那麼直接放入結果列表

else: # 如果當前字元為一切其他操作符

if len(stack) == 0: # 如果棧空,直接入棧

elif item in '*/(': # 如果當前字元為*/(,直接入棧

elif item == ')': # 如果右括號則全部彈出(碰到左括號停止)

t = stack.pop()

while t != '(':

t = stack.pop()

# 如果當前字元為加減且棧頂為乘除,則開始彈出

elif item in '+-' and stack[-1] in '*/':

if stack.count('(') == 0: # 如果沒有左括號,彈出所有

while stack:

else: # 如果有左括號,彈到左括號為止

t = stack.pop()

while t != '(':

t = stack.pop()

else:

# 表示式遍歷完了,但是棧中還有操作符不滿足彈出條件,把棧中的東西全部彈出

while stack:

# 返回字串

return result

#字尾表示式進行計算

def calac_houzhui(follow):

num =

base_opt = ['+', '-', '*', '/']

for j in follow:

if j.isdigit():

if j in base_opt:

num2 = num.pop()

num1 = num.pop()

if j == "+":

elif j == "-":

elif j == "*":

else:

return num

if __name__ == '__main__':

s = "9 + 3 * ( 2 + 1 )" #空格隔開,括號注意中英文不要亂

print(calac_houzhui(change_houzhui(s)))

>>>[18]

python四則運算程式 四則運算(Python)

四則運算程式 一 資訊 二.題目要求 寫乙個能自動生成小學四則運算題目的程式,然後在此基礎上擴充套件 除了整數以外,還要支援真分數的四則運算,例如 1 6 1 8 7 24 程式要求能處理使用者的輸入,判斷對錯,累積分數 程式支援可以由使用者自行選擇加 減 乘 除運算 三 import random...

四則運算 python

中綴表示式9 3 2 1 轉為字尾表示式思路9 3 2 1 設立乙個運算子棧和字尾表示式棧 第乙個元素為數字9,加入字尾表示式棧 9 第二個元素為運算子 加入到運算子棧 第三個元素為數字3,字尾表示式棧 9 3 第四個元素為運算子 由於 的優先順序大於棧頂元素 所以將其加入到運算子棧中 第五個元素為...

四則運算(Python)

四則運算程式 一 資訊 部落格班級 作業要求 作業目標 完成四則運算的基本內容 學號3190704135 二.題目要求 寫乙個能自動生成小學四則運算題目的程式,然後在此基礎上擴充套件 1除了整數以外,還要支援真分數的四則運算,例如 1 6 1 8 7 24 2程式要求能處理使用者的輸入,判斷對錯,累...