c++ 优先队列_什么是队列?(Python队列)
什么是隊列?(Python隊列)
前言
上篇文章介紹了
Python 中的多線程?mp.weixin.qq.com。今天來介紹下編程中常會用到的一個數(shù)據(jù)結(jié)構(gòu) - 隊列。
不知道大家是否還記得什么是數(shù)據(jù)結(jié)構(gòu)呢?在很早很早以前,Python小課堂的初期,講了許多 Python 原生的數(shù)據(jù)結(jié)構(gòu)。比如 list、tuple、dict 等。。。
既然叫數(shù)據(jù)結(jié)構(gòu),實際上就是為了給計算機存儲數(shù)據(jù)用的一種結(jié)構(gòu)體。不同的數(shù)據(jù)結(jié)構(gòu)都有其不同的特點。那今天就來簡單地聊聊隊列!
隊列的概念
拋開計算機知識體系,在咱們的生活中,隊列這個詞其實挺好想象的,因為無時無刻都可以見到。比如等公交的時候,需要排隊。比如買東西交錢的時候,也要排隊。在這些例子中,由人們有序形成的隊形就叫隊列。
生活中的排隊,有沒有什么特性而言呢?大家可以思考下,再往下看。
普通隊列的特性,即先進(jìn)先出(FIFO,first in first out)。對應(yīng)到生活中,怎么理解這個先進(jìn)先出?其實很好理解。
拿排隊買東西來說,每次排在隊首的人,交完錢肯定是當(dāng)前隊列中第一個離開收銀臺的人。當(dāng)隊首的人離開了,那么后面的所有人都要往前走,繼續(xù)結(jié)賬。
對應(yīng)到計算機中的隊列,就是因為第一個人先排的隊,所以他第一個交完錢就可以離開了,即先進(jìn)先出。(多說句,計算機世界許多東西其實就是抽象的現(xiàn)實世界示例。)
心細(xì)的同學(xué)會發(fā)現(xiàn),在上面將普通兩字標(biāo)粗了,那一定還有一些其它的常用特殊隊列,比如優(yōu)先級隊列。(PriorityQueue)
這次拿去銀行辦業(yè)務(wù)來舉例。生活中我們?nèi)ャy行辦理業(yè)務(wù),一般都需要去機器拿號,然后等待著柜臺業(yè)務(wù)人員叫號。叫到你,你就過去處理就行了。但是銀行是有 vip 服務(wù)的,擁有 vip 權(quán)益的人可以更快的享受到業(yè)務(wù)辦理,也就是說人家比你有更高的優(yōu)先權(quán)。vip特權(quán)通道,你值得擁有!
了解了生活中的例子,再來看看比較專業(yè)的定義:
優(yōu)先級隊列(priority queue) 是0個或多個元素的集合,每個元素都有一個優(yōu)先權(quán),對優(yōu)先級隊列執(zhí)行的操作有(1)查找(2)插入一個新元素 (3)刪除 一般情況下,查找操作用來搜索優(yōu)先權(quán)最大的元素,刪除操作用來刪除該元素 。對于優(yōu)先權(quán)相同的元素,可按先進(jìn)先出次序處理或按任意優(yōu)先權(quán)進(jìn)行。百度百科
也就是說,在優(yōu)先級隊列中,每個人都有一個優(yōu)先權(quán)對應(yīng),誰的優(yōu)先權(quán)高,誰就會先被處理。大家了解即可。
示例演示
示例情景:
假設(shè)下面有 6 個美少女,她們準(zhǔn)備去量身高,恰好這幾個妹紙是按照從高到低,從大到小排好隊的。
每走一個去量身高,這個隊列中就會少一個人。當(dāng)然,隊首在左,隊尾在右,于是她們的變化是下面這樣:
。。。。。。省略,直到:
代碼演示
是不是好多人看到這里就不打算看了。。不是讓你來看美少女的喂。。。下面才是重點~
第一部分代碼:
import簡單的講解下,在 Python3 中,有個模塊叫 queue。里面實現(xiàn)了幾個隊列的數(shù)據(jù)結(jié)構(gòu)。首先看 do_work() 函數(shù),其中它就是用來打印妹子姓名和年齡的。worker() 函數(shù)中寫了一層死循環(huán),只要隊列中有妹紙的數(shù)據(jù),就一直執(zhí)行打印,直到隊列中的妹紙都沒了,就跳出。
第二部分代碼:
q首先創(chuàng)建隊列,其次,讓這 6 個美少女開始依次排入到隊列中,開啟多線程去執(zhí)行 worker() 這個函數(shù)。worker() 函數(shù)就是第一部分代碼中,從隊列里一個個取出妹紙,在調(diào)用 do_work() 打印她們的姓名和年齡。
關(guān)于隊列的 join() 方法,可以看到官方給的英文注釋,大意是當(dāng)所有任務(wù)完成時才繼續(xù)執(zhí)行后面的代碼,否則處于阻塞狀態(tài)。
代碼中涉及的方法,老規(guī)矩,希望大家可以自己去查閱 Python 官方文檔,搜索 queue 即可看到。當(dāng)然如果懶得動手的話,筆者這里截圖幾個常用方法:
將妹紙放入隊列中:
從隊列中獲取妹紙:
獲取隊列中妹紙的個數(shù):
總結(jié)
通過兩篇文章,簡單的介紹了一下多線程和隊列,目的是為了接下來的多線程隊列爬蟲示例做準(zhǔn)備,如果對這些不了解的話,在后面的代碼中是很難看懂的。
關(guān)于隊列的使用,最常用的方法應(yīng)該就是放入、獲取、判斷隊列的大小。其實這三點在大部分?jǐn)?shù)據(jù)結(jié)構(gòu)里都是常用的操作,熟練掌握即可。
本章完整代碼,就是文中第一部分和第二部分的代碼拼接,因為太長,所以分開講了下。
如果大家有什么問題想溝通,可以留言交流哈!
總結(jié)
以上是生活随笔為你收集整理的c++ 优先队列_什么是队列?(Python队列)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端H5怎么切换语言_H5前端和移动AP
- 下一篇: 决策树 随机森林 xgboost_决策树