佇列是乙個有序列表,可以用陣列或是鍊錶來實現。
遵循先入先出的原則。即:先存入佇列的資料,要先取出。後存入的要後取出
用陣列模擬佇列示意圖
maxsize:陣列的長度
rear:指向佇列的最後乙個元素的後乙個位置
front:指向佇列中第乙個元素的位置
順序佇列
當佇列中元素為空時
向佇列中新增元素時
將元素新增到rear指向的位置中,再將rear後移一位
向佇列中取出元素時
將當前front指向的位置中的元素取出,再將front後移一位
1.當rear == front時,隊列為空,不可取出資料
2.當rear == maxsize時,佇列已滿,不可新增資料
**實現
class
queue
//判斷是否為空
public
boolean
isnull()
//判斷是否已滿
public
boolean
isfull()
//新增
public
void
add(
int x)
//將元素新增到當前rear指向的位置,並將rear後移一位
arr[rear++
]= x;
}//取出
public
intget()
//檢視佇列中的元素
public
void
show()
system.out.
println()
;}public
void
showfirst()
system.out.
println
(arr[front]);
}}
順序佇列的缺點
在上圖中我們的佇列最大容量為6,也就是說,只要沒有取出元素數量(有效元素數量)沒有超過該值時,我們就可以繼續新增,但事實上,我們在新增到佇列滿,然後取出元素後,仍然無法繼續新增,原因在於我們元素被取出後的空間
無法繼續利用,導致「假溢位」。為了解決這一問題,環形佇列由此誕生。
環形佇列
環形佇列中解決「假溢位」的方法
當新增元素後,佇列已滿時,會將rear指標指向陣列的第乙個位置
新增元素時
與順序佇列相同,但為了保證rear永遠小於maxsize,在rear後移一位後再與maxsize進取模運算
取出元素時
與順序佇列相同,但為了保證front永遠小於maxsize,在front後移一位後再與maxsize進取模運算
但這裡又有了新的問題,我們無法通過front == rear來判斷當前為空
隊列為空時
佇列已滿時
此時我們需要空出乙個位置作為「約定」
也就是說,只要佇列中還剩乙個位置時,此時的佇列已滿
判斷佇列已滿:(rear+1) %maxsize == front
判斷隊列為空:rear == front
計算佇列中有效元素數量:(rear - front + maxsize) % maxsize
**實現
class
queue
//判斷是否為空
public
boolean
isnull()
//判斷是否已滿
public
boolean
isfull()
//新增
public
void
add(
int x)
//將元素新增到當前rear指向的位置,並將rear後移一位
arr[rear]
= x;
rear =
(rear +1)
% maxsize;
}//取出
public
intget()
//檢視佇列中的元素
public
void
show()
system.out.
println()
;}//計算當前佇列中的有效個數
private
inteffectivequantity()
public
void
showfirst()
system.out.
println
(arr[front]);
}}
資料結構學習 佇列
定義 佇列 queue 是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。佇列是一種先進先出的 first in first out 的線性表,簡稱fifo。允許插入的一端為隊尾,允許刪除的一端為隊頭。佇列不允許在中間部位進行操作!假設佇列是q a1,a2,an 那麼a1就是隊頭元素,而a...
資料結構學習筆記 鍊錶篇
什麼是鍊錶 特點 資料元素的儲存對應的是不連續的儲存空間,每個儲存結點對應乙個需要儲存的資料元素。每個結點是由資料域和指標域組成。元素之間的邏輯關係通過儲存節點之間的鏈結關係反映出來。邏輯上相鄰的節點物理上不必相鄰。缺點 1 比順序儲存結構的儲存密度小 每個節點都由資料域和指標域組成,所以相同空間內...
資料結構學習筆記 棧 佇列 (習題)
1.引言 本文主要講解棧和佇列的一些常見的面試題。2.一些常見的面試題 2.1 題目 輸入兩個整數序列。其中乙個序列表示棧的push順序,判斷另乙個序列有沒有可能是對應的pop順序。為了簡單起見,我們假設push序列的任意兩個整數都是不相等的。比如輸入的push序列是1 2 3 4 5,那麼4 5 ...