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 第四個元素為運算子 由於 的優先順序大於棧頂元素 所以將其加入到運算子棧中 第五個元素為...