Python中堆、棧、隊列之間的區(qū)別小結(jié)
一、隊列概念
1、隊列是只有一端可以進行插入操作,而另一端可以進行刪除操作的有序線性存儲結(jié)構(gòu),滿足先進先出的約束。
2、在計算機科學(xué)中,隊列是一個集合,其中集合中的實體按順序保存,集合上的主要(或唯一)操作是向后端位置添加實體,稱為入隊,前端位置并刪除實體,稱為出隊。這使得隊列成為先進先出(FIFO)數(shù)據(jù)結(jié)構(gòu)。在FIFO數(shù)據(jù)結(jié)構(gòu)中,添加到隊列的第一個元素將是第一個要刪除的元素。這相當于一旦添加新元素,在刪除新元素之前必須刪除之前添加的所有元素的要求。通常偷看或還輸入了前面的操作,返回前面元素的值而不使其出列。隊列是線性數(shù)據(jù)結(jié)構(gòu)的示例,或者更抽象地是順序集合。
3、隊列提供計算機科學(xué),運輸和運營研究中的服務(wù),其中存儲和保存諸如數(shù)據(jù),對象,人或事件的各種實體以便稍后處理。在這些上下文中,隊列執(zhí)行緩沖區(qū)的功能。隊列在計算機程序中很常見,它們被實現(xiàn)為與訪問例程耦合的數(shù)據(jù)結(jié)構(gòu),作為抽象數(shù)據(jù)結(jié)構(gòu)或作為類的面向?qū)ο笳Z言。常見的實現(xiàn)是循環(huán)緩沖區(qū)和鏈表。
- 生活中典型的實例就是排隊,先到的人排在前面,可先得到服務(wù),后到的人排在后面,并且不能插隊。
- 計算機應(yīng)用中典型的實例就是打印機,先發(fā)送的打印任務(wù)可以先被執(zhí)行,之后的都要排隊等候
二、Python實現(xiàn)
1、在 Python 中,和棧一樣,同樣可以用列表作為隊列的底層實現(xiàn),只需要確定列表的哪一端作為隊列的頭,也即刪除操作端(先進先出),哪一端作為隊列的尾,也即插入操作端(后進后出)。同時,把隊列抽象為類,隊列的先進先出操作實現(xiàn)為類的方法。
2、從理論上講,隊列的一個特征是它沒有特定的容量。無論已包含多少元素,始終可以添加新元素。它也可以是空的,此時在再次添加新元素之前刪除元素是不可能的。
3、隊列的Python實現(xiàn):
Queue.qsize() 返回隊列的大小
Queue.empty() 如果隊列為空,返回True,反之False
Queue.full() 如果隊列滿了,返回True,反之False,Queue.full 與 maxsize 大小對應(yīng)
Queue.get()從隊列中移除并返回數(shù)據(jù)
Queue.get_nowait() 相當于Queue.get(False),非阻塞方法
Queue.put(item[, block[, timeout]])
將item放入隊列
timeout為正整數(shù)時,等待超時則拋出Full異常
block為False時,有空間可將數(shù)據(jù)放入隊列,立即拋出Full異常
Queue.task_done() 在完成一項工作之后,Queue.task_done()函數(shù)向任務(wù)已經(jīng)完成的隊列發(fā)送一個信號。每個get()調(diào)用得到一個任務(wù),接下來task_done()調(diào)用告訴隊列該任務(wù)已經(jīng)處理完畢。
Queue.join() 實際上意味著等到隊列為空,再執(zhí)行別的操作【線程阻塞,直到隊列中的所有任務(wù)處理完畢】
from Queue import Queue,LifoQueue,PriorityQueue #先進先出隊列 q=Queue(maxsize=5) #后進先出隊列 lq=LifoQueue(maxsize=6) #優(yōu)先級隊列 pq=PriorityQueue(maxsize=5) for i in range(5): q.put(i) lq.put(i) pq.put(i) print "先進先出隊列:%s;是否為空:%s;多大,%s;是否滿,%s" %(q.queue,q.empty(),q.qsize(),q.full()) print "后進先出隊列:%s;是否為空:%s;多大,%s;是否滿,%s" %(lq.queue,lq.empty(),lq.qsize(),lq.full()) print "優(yōu)先級隊列:%s;是否為空:%s,多大,%s;是否滿,%s" %(pq.queue,pq.empty(),pq.qsize(),pq.full()) print q.get(),lq.get(),pq.get() print "先進先出隊列:%s;是否為空:%s;多大,%s;是否滿,%s" %(q.queue,q.empty(),q.qsize(),q.full()) print "后進先出隊列:%s;是否為空:%s;多大,%s;是否滿,%s" %(lq.queue,lq.empty(),lq.qsize(),lq.full()) print "優(yōu)先級隊列:%s;是否為空:%s,多大,%s;是否滿,%s" %(pq.queue,pq.empty(),pq.qsize(),pq.full())
4、python的四種隊列操作
①LILO: 先進先出,只能在尾部插入元素,只能從頭部取出元素
from queue import Queue q = Queue() # 創(chuàng)建隊列對象 q.put(1) # 隊列尾部插入元素 q.put(2) q.put(3) print(q.queue) # 查看隊列中的所有元素 a = q.get() # 返回并刪除隊列頭部元素 print(a) print(q.queue) # 運行結(jié)果deque([2,3])
②LIFO:先進后出,類似棧
from queue import LifoQueue lifoQueue = LifoQueue() # 創(chuàng)建對象 lifoQueue.put(1) lifoQueue.put(2) lifoQueue.put(3) print(lifoQueue.queue) lifoQueue.get() # 返回并刪除隊列尾部元素 print(lifoQueue.queue) # 運行結(jié)果[1,2]
③優(yōu)先隊列:隊列元素為元組類型,即(優(yōu)先級,數(shù)據(jù))。
from queue import PrioritQueue as pq pq = pq() # 創(chuàng)建有限隊列 pq.put(1) pq.put(4) pq.put(3) print(pq.queue) # 運行結(jié)果[1,3,4] pq.get() # 返回并刪除優(yōu)先級最低的元素 print(pq.queue) # 運行結(jié)果[3,4]
④雙端隊列
>>> from collections import deque #雙端隊列 >>> dequeQueue = deque(['Eric','John','Smith']) >>> print(dequeQueue) deque(['Eric', 'John', 'Smith']) >>> dequeQueue.append('Tom') #在右側(cè)插入新元素 >>> dequeQueue.appendleft('Terry') #在左側(cè)插入新元素 >>> print(dequeQueue) deque(['Terry', 'Eric', 'John', 'Smith', 'Tom']) >>> dequeQueue.rotate(2) #循環(huán)右移2次 >>> print('循環(huán)右移2次后的隊列',dequeQueue) 循環(huán)右移2次后的隊列 deque(['Smith', 'Tom', 'Terry', 'Eric', 'John']) >>> dequeQueue.popleft() #返回并刪除隊列最左端元素 'Smith' >>> print('刪除最左端元素后的隊列:',dequeQueue) 刪除最左端元素后的隊列: deque(['Tom', 'Terry', 'Eric', 'John']) >>> dequeQueue.pop() #返回并刪除隊列最右端元素 'John' >>> print('刪除最右端元素后的隊列:',dequeQueue) 刪除最右端元素后的隊列: deque(['Tom', 'Terry', 'Eric'])
堆、棧、隊列之間的區(qū)別
1、堆是在程序運行時,而不是在程序編譯時,申請某個大小的內(nèi)存空間。即動態(tài)分配內(nèi)存,對其訪問和對一般內(nèi)存的訪問沒有區(qū)別。
2、棧就是一個桶,后放進去的先拿出來,它下面本來有的東西要等它出來之后才能出來。(后進先出)
3、隊列只能在隊頭做刪除操作,在隊尾做插入操作.而棧只能在棧頂做插入和刪除操作。(先進先出)
到此這篇關(guān)于Python中堆、棧、隊列之間的區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)Python 堆 棧 隊列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解python實現(xiàn)可視化的MD5、sha256哈希加密小工具
這篇文章主要介紹了詳解python實現(xiàn)可視化的MD5、sha256哈希加密小工具,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2020-09-09Python如何用str.format()批量生成網(wǎng)址(豆瓣讀書為例)
這篇文章主要介紹了Python如何用str.format()批量生成網(wǎng)址(豆瓣讀書為例),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09詳解PyTorch預(yù)定義數(shù)據(jù)集類datasets.ImageFolder使用方法
這篇文章主要為大家介紹了PyTorch預(yù)定義數(shù)據(jù)集類datasets.ImageFolder使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04Python數(shù)據(jù)結(jié)構(gòu)之列表與元組詳解
序列是Python中最基本的數(shù)據(jù)結(jié)構(gòu)。序列中的每個元素都分配一個數(shù)字 - 它的位置,或索引,第一個索引是0,第二個索引是1,依此類推,元組與列表類似,不同之處在于元組的元素不能修改。元組使用小括號,列表使用方括號2021-10-10python 讀取yaml文件的兩種方法(在unittest中使用)
這篇文章主要介紹了python 讀取yaml文件的兩種方法(在unittest中使用),幫助大家更好的理解和學(xué)習python,感興趣的朋友可以了解下2020-12-12