使用場景: 排隊買票
我們可以以排隊買票為例,將排隊的隊列視作Queue,先排隊的人先買票,後到的人排在後面等待買票,並且先買票的人買完票之後就離開隊伍;我們將第一個買票的人稱之為front,隊伍最後一個等待買票的人為rear。
當1號買完票離開換2號買票時,此時的front變為2號。
當又有下一個人(5號)要買票,此時rear從4號變到5號身上。
因此我們可以得出,當新增數據時,front不動rear動;刪除數據時,rear不動front動。
當我們將數據存入佇列時稱為addQueue,addQueue的處理須要有兩個步驟:
front == rear
為空。rear == maxSize-1
為佇列已滿。目前使用會遇到的困難為:佇列使用一次就不能再用,當我將數據取出,前端明明還有空位但想新增數據卻被告知佇列已滿。
因此需要優化,將之改為環形佇列。
思路分析
arr[front]
就是佇列的第一個元素,front 的初始值 = 0(rear+1) % maxSize = front
rear == front
(rear + maxSize - front) % maxSize
使用環形佇列後,數據可以一直刪減、新增直到沒有空餘的位置,形成一個環狀的結構,因此不會浪費多餘的空間。
舉個簡單的例子來加深印象好了:
當我今天宣告一個環形佇列 MaxSize 為4,那就代表我這個佇列有效數據最大是3,因為有一個儲存單元要預留下來判斷是否為空還是滿。
添加數據 10,20,30
arr[0] = 10 , arr[1] = 20 , arr[2] = 30
取出數據,則只剩下
arr[1] = 20 , arr[2] = 30
新增數據 40
arr[1] = 20 , arr[2] = 30 , arr[3] = 40
繼續取出 20 和 30
arr[3]=40
再去新增數據 50,60
arr[3] = 40 , arr[0] = 50 , arr[1] = 60
再把 40 取出,加入70 會變為
arr[0] = 50 , arr[1] = 60 , arr[2] = 70
rear == front
rear = maxSize -1
rear == front
(rear+1) % maxSize == front
(rear + maxSzie - front) % maxSize