特性:先進後出的資料結構
應用:每個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...