順序隊列是三中隊列之一,它是基於數組構造。具有隊首front,隊尾rear,元素數組element[],和元素個數length等屬性。
由於隊列的形式有三種,順序隊列只是之一(還有鏈式隊列和優先級隊列),因此首先寫一個結構等待實現
本文代碼主要參考自《數據結構(Java版)》–葉核亞,也即本人的教材,在此基礎上做修改或添加
package queue;
public interface Queue<T> {
/**
* 由於加了尾指針,因此入隊時間複雜性是O(1)
* 隊空條件隊頭隊尾節點都是null
* 該隊列不需要頭結點
* @return
*/
public abstract boolean isEmpty();
public abstract boolean add(T x);
public abstract T peek();
public abstract T poll();
}
然後順序隊列定義如下:
本人在《數據結構(Java版)》–葉核亞 的基礎上做了一些改動,加上了使用數組或順序表ArrayList構造順序隊列,加上了獲取隊列元素個數的屬性和方法,可以使隊列用起來更方便
package queue;
import java.util.ArrayList;
import java.util.Iterator;
/**
* @author ZhaoKe and TextBook
* @date: 2019年11月13日 下午7:27:38
*/
public class SeqQueue<T> implements Queue<T> {
private Object element[];
private int front, rear;
//@ author ZhaoKe
private int length = 0;
public SeqQueue(int length) {
if (length < 64)
length = 64;
this.element = new Object[64];
this.front = this.rear = 0;
}
//@ author ZhaoKe
public int getLength() {
return this.length;
}
//@ author ZhaoKe
public SeqQueue(T[] values) {
this();//沒有這一句就會發生NullPointException
for (int i = 0; i < values.length; i++) {
this.add(values[i]);
}
}
//@ author ZhaoKe
//使用順序表構造順序隊列
public SeqQueue(ArrayList<T> values) {
this();//沒有這一句就會發生NullPointException
Iterator<T> it = values.iterator();
while (it.hasNext()) {
T t = (T) it.next();
this.add(t);
}
}
public SeqQueue() {
this(64);
}
@Override
public boolean isEmpty() {
return this.front == this.rear;
}
@Override
public boolean add(T x) {
if(x == null)
return false;
if (this.front == (this.rear+1) % this.element.length) {
//如果隊滿,擴容之後原本的加入隊列
Object[] temp = this.element;
this.element = new Object[temp.length*2];
int j = 0;
for (int i = 0; i != this.rear; i = (i+1)%temp.length)
this.element[j++] = temp[i];
this.front = 0;
this.rear = j;
}
//然後加入x,修改隊尾指針
this.element[this.rear] = x;
this.rear = (this.rear + 1) % this.element.length;
this.length++;
return true;
}
@SuppressWarnings("unchecked")
@Override
public T peek() {
return this.isEmpty() ? null : (T)this.element[this.front];
}
@Override
public T poll() {
if(this.isEmpty())
return null;
@SuppressWarnings("unchecked")
T temp = (T)this.element[front];
this.front = (this.front + 1)% this.element.length;
this.length--;
return temp;
}
}
看不懂的地方可以評論,最遲一節課時間就能改動或回覆hhhhh~~
–CUST ZKe