資料結構之棧和佇列

2022-05-17 02:56:32 字數 4965 閱讀 4851

特性:先進後出的資料結構

應用:每個web瀏覽器都有乙個返回按鈕,當你瀏覽網頁時,這些網頁被放置在乙個棧中(網頁的**)。你現在檢視網頁的位址儲存在棧的頂部,你第乙個檢視網頁的位址儲存在棧的底部。如果按"返回"按鈕,將按相反的順序瀏覽剛才的頁面。

stack()   建立乙個空的新棧。他不需要引數,返回建立的新棧

push(item)將乙個新資料新增到棧的頂部,他需要item引數,並且不返回任何內容

pop() 從棧中刪除頂部項,他不需要引數並返回item。棧被修改

peek() 從棧返回頂部項,但不會刪除它,不需要引數,不修改棧

isempty() 測試棧是否為空。不需要引數,返回布林值

size() 返回棧中item數量。不需要引數,並返回乙個整數

from pythonds.basic.stack import stack

s=stack() #例項化建立乙個棧

s.push("11") #向棧頂部放入資料

s.push("22")

s.push("33")

s.push("44")

print(s.size()) #檢視棧中有多少個元素

print(s.pop()) #取出棧頂部第乙個元素

print(s.peek()) #返回棧頂第乙個元素

print(s.isempty())#判斷棧是否為空

class stack():

def __init__(self): #使用列表實現棧

self.li=

def push(self,item): #向棧頂部放入資料

def pop(self): #取出棧頂部第乙個元素

ret=self.li.pop()

return ret

def peek(self): #返回棧頂第乙個元素

ret=self.li[-1]

return ret

def size(self): #檢視棧中有多少個元素

ret=len(self.li)

return ret

def isempty(self): #判斷棧是否為空

return self.li==

s=stack()

s.push(1)

s.push("11") #向棧頂部放入資料

s.push("111")

s.push("33")

s.push("44")

print(s.size()) #檢視棧中有多少個元素

print(s.pop()) #取出棧頂部第乙個元素

print(s.peek()) #返回棧頂第乙個元素

print(s.isempty())#判斷棧是否為空

佇列:先進先出

應用場景:我們的計算機實驗室有 30 臺計算機與一台印表機聯網。當學生想要列印時,他們的列印任務與正在等待的所有其他列印任務「一致」。第乙個進入的任務是先完成。如果你是最後乙個,你必須等待你前面的所有其他任務列印

queue() 建立乙個空的新佇列。 它不需要引數,並返回乙個空佇列。

put(item) 將新項新增到隊尾。 它需要 item 作為引數,並不返回任何內容。

get() 從隊首移除項。它不需要引數並返回 item。 佇列被修改。

empty() 檢視佇列是否為空。它不需要引數,並返回布林值。

qsize() 返回佇列中的項數。它不需要引數,並返回乙個整數。

from queue import queue

q=queue() #例項化乙個佇列

q.put("sss") #向佇列裡放入乙個元素

q.put("aaa")

q.put("ddd")

print(q.get()) #從佇列取出第乙個元素

print(q.empty()) #判斷佇列是否為空

print(q.qsize()) #檢視佇列的長度

class queue():

def __init__(self): #使用列表完成佇列的實現

self.li=

def put(self,item): #向佇列裡放入乙個元素

def get(self): #從佇列取出第乙個元素

return self.li.pop(0)

def empty(self): #判斷佇列是否為空

return self.li==

def qsize(self): #檢視佇列的長度

return len(self.li)

q=queue() #例項化乙個佇列

q.put('11')

q.put('22')

q.put('33')

print(q.get()) #從佇列取出第乙個元素

print(q.empty()) #判斷佇列是否為空

print(q.qsize()) #檢視佇列的長度

同佇列相比,有兩個頭部和尾部。可以在雙端進行資料的插入和刪除,提供了單資料結構中棧和佇列的特性
pop() 刪除雙端佇列隊尾的元素

popleft() 刪除雙端佇列隊首的元素

reverse() 將雙端佇列反轉(無返回值)

clear() 清空雙端佇列(無返回值)

from collections import deque

dq=deque(['1','2','3']) #例項化乙個雙端佇列

print(dq) #檢視雙端佇列

print(dq)

print(dq)

print(dq.pop()) #刪除雙端佇列隊尾的元素

print(dq.popleft()) #刪除雙端佇列隊首的元素

dq.reverse() #將雙端佇列反轉(無返回值)

dq.clear() #清空雙端佇列(無返回值)

print(dq)

class dequeue():

def __init__(self,*args,**kwargs):

if args: #方便使用者通過例項化時傳值直接建立雙端佇列

self.li=list(args)

else:

self.li=list(kwargs)

def __str__(self): #列印佇列時,返回字串形式的佇列

return str(self.li)

self.li.insert(0,item)

def pop(self): #刪除雙端佇列隊尾的元素

return self.li.pop()

def popleft(self): #刪除雙端佇列隊首的元素

return self.li.pop(0)

def reverse(self): #將雙端佇列反轉(無返回值)

self.li.reverse()

def clear(self): #清空雙端佇列(無返回值)

self.li=

dq=dequeue()

print(dq) #檢視雙端佇列

print(dq.pop()) #刪除雙端佇列隊尾的元素

print(dq.popleft()) #刪除雙端佇列隊首的元素

dq.reverse() #將雙端佇列反轉(無返回值)

print(dq)

dq.clear() #清空雙端佇列(無返回值)

print(dq)

import heapq

#利用heapq實現乙個簡答的優先順序佇列

class priorityqueue:

def __init__(self):

self._queue=

self._index=0

def push(self,item,priority):

self._index+=1

def pop(self):

class item:

def __init__(self,name):

self.name=name

def __repr__(self):

return 'item()'.format(self.name)

if __name__ == '__main__':

q=priorityqueue()

q.push(item('foo'),1)

q.push(item('bar'),5)

q.push(item('spam'),4)

q.push(item('grok'),1)

print(q.pop())

print(q.pop())

#具有相同優先順序的兩個元素,返回的順序同它們插入到佇列時的順序相同

print(q.pop())

print(q.pop())

from queue import lifoqueue #lifo佇列

lifoqueue = lifoqueue()

lifoqueue.put(1)

lifoqueue.put(2)

lifoqueue.put(3)

print('lifo佇列',lifoqueue.queue)

lifoqueue.get() #返回並刪除佇列尾部元素

lifoqueue.get()

print(lifoqueue.queue)

資料結構之棧和佇列

棧 stack 是限定僅在表尾進行插入和刪除操作的線性表。我們把允許插入和刪除的一端稱為棧頂 top 另一端稱為棧底 bottom 不含任何資料元素的棧稱為空棧。棧又稱為後進先出 last in first out 的線性表,簡稱lifo結構。棧的插入操作,叫做進棧,也稱壓棧 入棧。類似子彈入彈夾。...

資料結構之棧和佇列

棧是乙個非常常見的資料結構,它在計算機領域中被廣泛的使用,比如作業系統會給每個執行緒分配乙個棧。用來儲存函式呼叫時各個函式的引數,返回值以及臨時變數等。棧的特點是先進後出。通常棧是乙個不考慮排序的資料結構,我們需要o n 時間才能找到棧中的最大值或者最小值,如果想要在o 1 時間內找到棧中的最大值或...

資料結構之棧和佇列

讀自 資料結構 c語言版 嚴蔚敏 吳偉民 清華大學出版社 棧 棧是限定僅在表尾進行插入或刪除操作的線性表。因此對於棧來說,表尾端有其特殊含義,稱為棧頂 top 相應地,表頭端稱為棧底 bottom 不含元素的空表稱為空棧。後進先出lifo 棧的順序儲存表示 define stack init siz...