2.棧的應用
總結在這個系列的第一篇部落格中,我主要強調了程式設計思維的重要性以及如何高效準確的編寫出能解決問題的**,這一篇部落格開始就正式開始python資料結構相關的知識。
有一種資料結構,它的元素順序取決於新增的順序或者刪除的順序,一旦某個元素被新增進來,它與前後元素的相對位置也就保持不變了,這樣的資料集合就被稱為線性資料結構。
常見的線性資料結構主要有:棧、佇列、雙端佇列、列表。接下來的幾篇部落格會來詳細講講這幾種線性資料結構和它們的實現
棧,它的新增和刪除操作總發生在同一端,即頂端。它的特性呢就是「先進後出」(或者說「後進先出」,都是乙個意思),也就是說最先進入棧的元素在棧中會呆最久,那麼頂端的元素總是最近才新增的,而底端的元素總是最開始新增的。
生活中有很多棧的例子,比如:我們洗好的盤子疊起來放,總是先洗好的放在最下面;一堆摞起來的書,我們要拿到其中某一本,就需要先移開上面的那些書;或者有沒有想過,我們瀏覽網頁之所以可以返回之前瀏覽的網頁,那是不是也是因為我們瀏覽的網頁記錄被放到棧中了呢?
棧抽象資料型別的操作:
有了這些基本操作,那我們就嘗試著實現乙個棧
class
stack()
:def
__init__
(self)
: self.items=
defisempty
(self)
:return
'棧為空'
if self.items==
else
'棧不為空'
defpush
(self,item)
:def
pop(self)
:return self.items.pop(
)def
peek
(self)
:return self.items[
len(self.items)-1
]def
size
(self)
:return
len(self.items)
defshow
(self)
:return self.items
# 例項化測試一下
s=stack(
)# 初始應該為空
print
(s.isempty())
# 壓入幾個元素試試
s.push(4)
s.push(
'abc'
)s.push(18)
s.push(
'dl'
)# 再來看看是否為空,以及棧的大小和棧頂元素
print
(s.isempty())
print
(s.size())
print
(s.peek())
# 然後試試刪除棧頂元素
print
(s.pop())
print
(s.size())
# 顯示所有元素
print
(s.show(
))
思考
如果我們用列表頭作為棧頂,如何實現棧?與上面用列表尾實現效率上有什麼不同
今天先來說說常見的兩個應用:匹配符號,表示式轉換
我們知道(),,{}總是成對出現,並且有一定的順序,所以我們可以利用棧實現乙個檢測器,看輸入的符號是否符合規範。
對於表示式,我們有中序表示式也有前序,後序,它們之間的轉換也可以利用棧實現
思路:
我們遍歷輸入的表示式,將(['
:#先定義一下運算子的優先順序
prec=
prec[
'*']=3
prec[
'/']=3
prec[
'+']=2
prec[
'-']=2
prec[
'(']=1
op=stack(
) postfix_list=
# 以表示式中的空格分開,得到表示式中的每乙個元素,返回列表
tokenlist=expr.split(
)# 開始遍歷
for token in tokenlist:
# 如果匹配到大寫的英文本母直接新增到後續表示式
if token in string.ascii_uppercase:
# 如果匹配到左括號,那就直接入棧
elif token==
'(':
op.push(token)
# 匹配到右括號,就把棧中左括號之後新增的所有符號都拿出來放進後續表示式中
elif token==
')':
toptoken=op.pop(
)while toptoken!=
'(':
toptoken=op.pop(
)# 棧不為空,且當前符號優先順序小於棧頂元素優先順序,
# 那麼就把棧頂元素新增到後序表示式,同時把優先順序小的運算子入棧
Python線性資料結構
python線性資料結構 toc 碼好python的每一篇文章.本章要介紹的線性結構 list tuple string bytes bytearray。對於這兩種表,陣列中的元素進行查詢 增加 刪除 修改,看看有什麼影響 說明 列表是由若干元素物件組成,且是有序可變的線性資料結構,使用中括號 表示...
Python線性資料結構
python線性資料結構 目錄碼好python的每一篇文章.本章要介紹的線性結構 list tuple string bytes bytearray。說明 列表是由若干元素物件組成,且是有序可變的線性資料結構,使用中括號 表示。說明 元組是由若干元素物件組成,且是有序不可變的資料結構,使用小括號 表...
Python資料結構01 線性結構
後進先出的結構,主要有如下操作 stack push item pop peek isempty size class stack def init self self.items def push self,item def pop self return self.items.pop def p...