隊列(Queue)是隻允許在一端進行插入,而在另一端進行刪除的運算受限的線性表。
隊列的存儲結構及實現
隊列的順序存儲結構
(1) 順序隊列的定義:
隊列的順序存儲結構稱爲順序隊列,順序隊列實際上是運算受限的順序表。
(2)順序隊列的表示:
和順序表一樣,順序隊列利用內存中一段連續的存儲空間來存放當前隊列中的元素。
由於隊列的隊頭和隊尾的位置是變化的,設置兩個指針front和rear分別指示隊頭元素和隊尾元素,它們的初值在隊列初始化時均應置爲0。
放上網上找的一張圖更爲清晰,這裏隊尾指針指向的an還沒有進隊,因爲在入隊列時尾指針向的是隊列的下一個結點,即這個結點還不是隊列的元素
我還是用的數組去實現了順序隊列的數據結構
<pre name="code" class="java">package com.gaorui.Stack;
public class ArrayQueue {
private int DEFAULT_SIZE = 10;// 默認大小
private int ArraySize;//隊列元素大小
private Object[] elementData;// 定義一個數組用於保存順序隊列的元素
private int front;// 隊頭
private int rear;// 隊尾
// 1.0 構造方法初始化空隊列
public ArrayQueue() {
ArraySize = DEFAULT_SIZE;
elementData = new Object[ArraySize];
}
/**1.2構造方法初始化空隊列
* 以指定長度的數組來創建順序隊列
*
* @param element
* 指定順序隊列中第一個元素
* @param initSize
* 指定順序隊列底層數組的長度
*/
public ArrayQueue(Object data, int ArraySize) {
this.ArraySize = ArraySize;
elementData = new Object[ArraySize];
elementData[0] = data;
rear++;
}
// 入隊
public void offer(Object data) {
elementData[rear++] = data;//當新元素入隊,賦值給當前隊尾指針指向的域,然後隊尾指針+1,隊尾指針指向下一個即將入隊的新元素。
}
// 出隊,並刪除隊頭元素
public Object poll() {
if (isEmpty()) {
return "null";
}
Object data = elementData[front++];//Object類型對象保存隊頭元素,隊頭指針++後移一位
elementData[front-1] = null;//因爲隊頭指針後++ 已經向後移了一位,所以需要-1向前移動一位將值清空
return data;
}
//返回隊列頂元素,但不是出隊
public Object peek(){
if (isEmpty()) {
return "null";
}
Object data = elementData[front];
return data;
}
//對頭指針和隊尾指針重合,則證明隊列此時爲null
public boolean isEmpty() {
return rear == front;
}
//獲取隊列大小
public int getArrayQueueSize(){
return rear-front;
}
/**
* Test
* @param
* @author JavaGR_ais
*/
public static void main(String[] args) {
ArrayQueue aq = new ArrayQueue();
aq.offer(1);
aq.offer(2);
aq.offer(3);
System.out.println(aq.getArrayQueueSize()+"棧頂元素"+aq.peek());
aq.poll();
System.out.println(aq.poll()+"出隊");
aq.offer(5);
System.out.println(aq.getArrayQueueSize()+"棧頂元素"+aq.peek());
System.out.println(aq.poll());
}
}