2. 隊列 隊列-Queue

[TOC]

隊列-Queue

又叫先進先出表;先進先出結構、只允許在一端進行插入操作、而在另一端進行刪除操作的線性表。
插入數據的一端是隊尾,取數據的一端則是隊頭

Queue接口主要方法

  • boolean add(E e);:增加
  • boolean offer(E e);:增加,不會拋IllegalStateException異常(隊列滿,無法添加)而是返回false
  • E remove();:移除
  • E poll();:移除,調用空隊列時不會拋異常NoSuchElementException,而是返回null
  • E element();:取隊頭數據但不移除
  • E peek();:取隊頭數據但不移除 調用空隊列時不會拋異常NoSuchElementException,而是返回null

順序存儲隊列

普通隊列

數組實現,空隊列時,隊頭、隊尾下標均爲0,添加元素時,隊尾向後移動一位,移除元素時,隊頭向後移動一位。因爲下標一直在往後移動,所以之前釋放的元素位置無法再被利用,這樣就導致了假溢出現象(無法添加,但隊列並不是滿的)

循環隊列

隊列的頭尾相接的順序存儲結構。用於解決假溢出現象。

假設循環隊列總容量爲N,預留一個空的位置(rear永遠指向爲空的位置),front爲頭節點下標,rear爲尾節點下標

  • 隊列空:front==rear;
  • 隊列滿:(rear+1)%N==front;
  • 隊列元素個數:(rear – front + N)%N 若rear能存放數據:rear>front時:(rear-front)%N+1 rear<front: (rear-front+N)%N+1
  • 移除:front = (front+1)%N
  • 增加:rear =(rear+1)%N

鏈式存儲隊列

其實就是線性表的單鏈表 ,只不過只能尾進頭出

雙端隊列 Deque

Deque:是一種具有隊列和棧的性質的數據結構。雙端隊列中的元素可以從兩端彈出,其限定插入和刪除操作在表的兩端進行

  • LinkedList
  • ArrayDeque
    用數組實現執行效率高
  • linkedBlockingDeque

優先級隊列

優先級隊列和通常的棧和隊列一樣,只不過裏面的每一個元素都有一個”優先級”,在處理的時候,首先處理優先級最高的。如果兩個元素具有相同的優先級,則按照他們插入到隊列中的先後順序處理。

  • MessageQueue:消息執行時間越早,插入位置越前

  • PriorityQueue:重要程度排序

相關算法題

  • 手寫實現雙端隊列
  • 優先級隊列完成CPU調度
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章