Java順序隊列的定義~

順序隊列是三中隊列之一,它是基於數組構造。具有隊首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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章