python 棧 解析四則運算公式

2021-10-23 09:20:39 字數 3953 閱讀 4032

2、解析四則運算-coding

也被稱為下堆疊, 他是有序集合, 新增操作和移除操作發生在同一端,即頂端, 另一端稱為底端

支援以下操作

處理括號匹配

由空棧開始,從左往右依次處理括號。遇到左括號, 使用push操作將其加入棧中;如果遇到右括號就呼叫pop操作, 所有的左括號都應有右括號與之匹配。

處理完括號匹配,棧應該是空的

處理完表示式後將棧中殘餘的運算子追加至轉換結果列表中

處理完表示式後, 從棧中獲取數值

後序表示式計算

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

"""中序表示式轉後序表示式, 並計算

"""import re

import operator

import string

class

postorderconversion

:def

conversiontopostorder

(self, inorderexpr)

:"""

後序轉換

"""# 構建運算子優先順序字典

prec =

ifnot self.parsechecker(inorderexpr)

:raise valueerror

opstack = stack(

) postorderlist =

list()

exprlist = inorderexpr.split(

)for ch in exprlist:

if ch.isdigit():

elif ch ==

"(":

opstack.push(ch)

elif ch ==

")":

topoper = opstack.pop(

)while topoper !=

"(":

topoper = opstack.pop(

)else

:# 比較運算子優先順序,如果棧中運算子的優先順序》當前運算子, 追加至轉換列表中

while

(not opstack.isempty())

and(prec[opstack.peek()]

> prec[ch]):

))opstack.push(ch)

# 將棧中的運算子追加至轉換列表中

while

not opstack.isempty():

))return

"".join(postorderlist)

defcalculatepostorderformulas

(self, postorderformulas)

:"""

計算後序表示式

"""operadict =

poststack = stack(

) postorderlist =

list

(postorderformulas)

for ch in postorderlist:

if ch.isdigit():

poststack.push(

eval

(ch)

)else

: opn1 = poststack.pop(

) opn2 = poststack.pop(

) poststack.push(operadict[ch]

(opn2, opn1)

)return poststack.pop(

)def

parsechecker

(self, symbolstr)

:"""

判斷括號是否完全匹配

"""symbolstr = self.extractbrackets(symbolstr)

s = stack(

) balanced =

true

index =

0while index <

len(symbolstr)

and balanced:

symbol = symbolstr[index]

if symbol in

"]')

return

"".join(regex.findall(formulas)

)def

matches

(self,

open

, close)

: opens =

"])"

return opens.index(opens)

== closers.index(close)

if __name__ ==

"__main__"

: formulas1 =

"( 1 + 2 ) * 3"

formulas2 =

"5 + 6 * 7"

postconversion = postorderconversion(

) cformulas1 = postconversion.conversiontopostorder(formulas1)

cformulas2 = postconversion.conversiontopostorder(formulas2)

print

("formulas1: %s | formulas1: %s"

%(cformulas1, cformulas1)

)print

("formulas1: %s="

% formulas1, postconversion.calculatepostorderformulas(cformulas1)

)print

("formulas2: %s="

% formulas2, postconversion.calculatepostorderformulas(cformulas2)

)

計算結果

formulas1: 12+3* | formulas1: 12+3*

formulas1: ( 1 + 2 ) * 3= 9

formulas2: 5 + 6 * 7= 47

建立棧

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

class

stack()

:def

__init__

(self)

: self.items =

list()

defisempty

(self)

:return self.items ==

defpush

(self, item)

:def

pop(self)

:return self.items.pop(

)def

peek

(self)

:return self.items[-1

]def

size

(self)

:return

len(self.items)

if __name__ ==

"__main__"

: stack = stack(

) stack.push(1)

stack.push(2)

stack.push(3)

stack.push(4)

print

(stack.items)

print

(stack.peek())

print

(stack.isempty(

))

Python 棧 四則運算

首先了解一下棧 棧是限定僅在表尾進行插入和刪除操作的線性表。允許插入與刪除的一段叫做棧頂,另一端 叫做棧底,不含任何資料元素的棧稱為空棧。棧又稱為後進先出 last in first out 的線性 表,簡稱lifo結構。在python中,可以用列表來實現棧 lt 3 相當於壓棧 print lt ...

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

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

四則運算 python

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