隊列的理解(利用數組實現循環隊列)

隊列

隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱爲隊尾,進行刪除操作的端稱爲隊頭。隊列中沒有元素時,稱爲空隊列。——來源於百度百科

在隊列中第一個被插入的數據項也會第一個被移除(先進先出(FIFO)),理解:現實生活中的排隊,排在第一個的總是第一個離開。

應用:模擬現實生活中類似銀行排隊等待,飛機起飛等待,網絡數據包等待傳送等;

循環隊列理解:隊列在數組中實現時當刪除或插入數據時數據項時不會移動的,它是通過指針來記錄第一個插入和最後一個插入的元素的位置來實現隊首和隊尾的。


代碼實現:

package net.hncu.d0731;

public class QueueModel {
	private int maxSize;//空間
	private Object[] o;
	private int front;//隊首指針
	private int rear;//隊尾指針
	
	QueueModel(int maxSize){
		//給數組多開闢一個空間是爲了判斷棧爲空和棧滿front和rear值相同的情況
		this.maxSize=maxSize+1;
		o=new Object[this.maxSize];
		front=0;
		rear=-1;
	}
	
	public void insert(Object j) {
		//如果隊尾到了最大值,則重新調到初始位置
		if(rear==maxSize-1) {
			rear=-1;
		}
		o[++rear]=j;
	}
	
	public Object remove() {
		//同樣如果隊首到了最大值也重新調到初始位置
		Object temp = o[front++];
		if(front==maxSize)
			front=0;
		return temp;
	}
	
	public Object peek() {
		return o[front];
	}
	
	public boolean isFull() {
		return (rear+2==front||front+maxSize-2==rear);
	}
	
	public boolean isEmpty() {
		return (rear+1==front||front+maxSize-1==rear);
	}
	
	public int size() {
		if(rear>=front)
			return rear-front+1;
		else
			return (maxSize-front)+(rear+1);
	}
}

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