【數(shù)據(jù)結(jié)構(gòu)與算法】隊列

一、是什么

一種先進先出線性表數(shù)據(jù)結(jié)構(gòu),只支持入隊和出隊操作

二、使用場景

  • MySQL連接池
  • Redis單線程特性
  • 分布式消息隊列

三、工作原理

隊尾插入元素,隊頭刪除元素

四、隊列類型

  • 順序隊列:
    數(shù)組實現(xiàn)的就是順序隊列(有數(shù)據(jù)搬移操作)
  • 循環(huán)隊列:
    將數(shù)組的首尾相連,形成一個環(huán)(沒有數(shù)據(jù)搬移操作)
  • 阻塞隊列:
    當隊列為空時,從隊頭取數(shù)據(jù)會被阻塞;當隊列已滿時,插入數(shù)據(jù)的操作將被阻塞,形成一個生產(chǎn)者-消費者模型
  • 并發(fā)隊列:
    在多線程情況下, 會有多個線程同時操作隊列,此時如果是線程安全的隊列我們就叫作并發(fā)隊列。一般使用CAS(類似樂觀鎖)和鎖來實現(xiàn)并發(fā)隊列。

四、實現(xiàn)

  • 代碼實現(xiàn)
type list []int

func NewList() *list {
    newList := make(list, 0)
    return &newList
}

func listPush(newList *list, a ...int) {
    *newList = append(*newList, a...)
}

func listPop(newList *list) (listObj int) {
    length := len(*newList)
    if length <= 0 {
        return
    }
    listObj = (*newList)[0]
    *newList = (*newList)[1:length]
    return
}
  • Redis實現(xiàn)

rpush + lpop = list(隊列)

五、優(yōu)劣

  • 優(yōu)點:
  1. 不涉及到數(shù)組搬移時,出隊和入隊的時間復雜度都為 O(1)
  2. 操作受限,使用比較可控,不容易出錯(和數(shù)組、鏈表相比較
  • 缺點:
  1. 在內(nèi)存中,隊列結(jié)構(gòu)里的數(shù)據(jù)大小和生命周期是固定的,缺乏靈活性

六、替代性技術(shù)

  • 數(shù)組
  • 鏈表
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容