第五章棧和佇列(棧)

2021-10-05 08:46:46 字數 2655 閱讀 3406

後進先出,常見的快取結構

#棧是保證元素後進先出

'''adt stack:

stack(self) #建立空棧

is_emplty(self) #判斷棧是否為空,空時返回true否則返回false

push(self,elem) #壓棧

pop(self) #彈出

top(self) #取得最後壓入棧的元素

'''

a)實現

'''

棧的順序表實現

'''class stackunderflow(valueerror): #空棧訪問

pass

class sstack(): #基於順序表技術實現的棧類

def __init__(self): #用list物件_elems儲存棧元素

self._elems = #所有棧操作都對映到list操作

def is_emply(self):

return self._elems ==

def top(self):

if self._elems == :

raise stackunderflow('in sstack.top()')

return self._elems[-1]

def push(self,elem):

def pop(self):

if self._elems == :

raise stackunderflow('in sstack.top()')

return self._elems.pop()

#定義表節點類

class lnode:

def __init__(self,elem,next_=none):

self.elem=elem

self.next=next_

class lstack(): #基於鍊錶技術實現的棧類,用lnode作為結點

def __init__(self):

self._top = none

def is_empty(self):

return self._top is none

def top(self):

if self._top is none:

raise stackunderflow('in lstack.top()')

return self._top.elem

def push(self,elem):

self._top = lnode(elem,self._top)

def pop(self):

if self._top is none:

raise stackunderflow('in lstack.top()')

p = self._top

self._top = p.next

return p.elem

b)簡單應用

#括號匹配問題

def check_parens(text):

'''括號配對檢查函式,text是被檢查的正文串'''

parens = '(){}'

open_parens = '([':'

def parentheses(text):

'''括號生成器,每次呼叫返回text裡的下一括號及其位置'''

i,text_len = 0, len(text)

while true:

while i=text_len:

return

yield text[i],i

i+=1

st=sstack() #棧

for pr,i in parentheses(text): #迭代

if pr in open_parens:

st.push(pr) #壓棧

elif st.pop()!=opposite[pr]: #匹配失敗,推出

print('unmatching is foundat',i,'for',pr)

return false

print('all parentheses are correctly matched')

c)棧和遞迴

1、遞迴函式的執行需要棧(程式執行棧)。後呼叫先返回

2、任何遞迴定義的函式(程式),都可以通過引入乙個棧儲存 中間結果,翻譯為乙個非遞迴的過程。與此對應,任何乙個包含迴圈的 程式都可翻譯為乙個不包含迴圈的遞迴程式。(就目前計算機的算力來說,函式呼叫的效率損失多半都可以接受,所以不一定非得翻譯成非遞迴)

第五章 佇列

佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端 front 進行刪除操作,而在表的後端 rear 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。棧 後進先出,只允許在棧頂進行插入和刪除。佇列 先進先出,在隊尾進行插入,在對頭進行刪除...

第五章佇列

佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端 front 進行刪除操作,而在表的後端 rear 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。queue 類定義和一些測試 function queue 向隊尾新增乙個元素 func...

資料結構與演算法C 語言描述第五章棧和佇列

第 5章棧和佇列 棧和佇列是兩種面向表的資料結構 5.1棧 棧的實現以及 stack 類棧的標準模型是自助餐廳的盤子堆 5.1.1 棧的操作 5.1.2 stack 類的實現 class cstack public int count public void push object item pub...