什么是隊列
隊列是一種 先進先出 的線性數(shù)據(jù)結構,其定義了隊頭和隊尾兩個端,限制只能從隊頭彈出數(shù)據(jù),從隊尾壓入數(shù)據(jù)
隊列在日常生活中也很常見,比如我們去食堂打飯的時候,人多就需要排隊,排在前面的先打了飯走了,排在后面的需要等到前面的打完飯才能打飯
隊列的類型
隊列可以使用 數(shù)組 或者 鏈表 實現(xiàn),使用數(shù)組實現(xiàn)的叫做順序隊列,使用鏈表實現(xiàn)的叫做鏈式隊列。還有一些基于這兩種隊列實現(xiàn)的隊列,比如:循環(huán)隊列( 順序隊列不用數(shù)據(jù)搬移 )、阻塞隊列( 入隊出隊可阻塞 )、并發(fā)隊列( 線程安全 ) 等
數(shù)組實現(xiàn)隊列
數(shù)組實現(xiàn)隊列要點:
- 入隊 數(shù)據(jù)直接放到 tail指針 位置
- 出隊 將 head指針 后移就行,不用搬移數(shù)據(jù),在 tail 指針到達數(shù)組末尾的時候一起搬移,效率更高
鏈表實現(xiàn)隊列
鏈表實現(xiàn)隊列要點:
- 入隊數(shù)據(jù)直接放到鏈表末尾
- 出隊直接將 head指針 后移
循環(huán)隊列
基于數(shù)組可以實現(xiàn)循環(huán)隊列,即在 tail指針 到達數(shù)組末尾的時候,再將其移動到數(shù)組頭部,直到 數(shù)組只剩 tail指針一個空位
循環(huán)隊列主要是如何判斷對空、隊滿,從上圖可以看出,如果隊滿,tail指針 應該是在 head指針 '前面' 一個位置,所以當 (tail +1)%length === head 的時候,隊列應該就是滿了,因為判斷的時候 tail指針 位置沒有數(shù)據(jù)存放,所以循環(huán)隊列在隊滿的時候 tail指針所在位置是放空的,隊空的判斷就是 head === tail
在實現(xiàn)的時候,要注意 head、tail指針 在賦值的時候 需要對數(shù)組長度進行取余,而不是單純的+1,因為要從數(shù)組末尾再回到數(shù)組頭部形成環(huán)
思考
- 基于數(shù)組和鏈表實現(xiàn)的隊列有何區(qū)別?
基于鏈表可以實現(xiàn)一個支持可以無限排隊的無界列隊,基于數(shù)組可以實現(xiàn)支持有限排隊的有界隊列