數據結構之隊列
定義
隊列,是一種先進先出(FIFO, firt in first out)的線性表。隊列的特性是只允許在一端進行插入操作,而在另一端進行刪除操作。允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭。類似于火車站排隊買票的隊列。
隊列分為普通隊列和循環隊列,一般使用循環隊列,因為循環隊列有更高的時間和空間效率。
具體實現
/**
* 循環隊列實現
*/
public class MyQueue {
private int[] mData; //隊列存儲內容
private int mQueueCapacity; //隊列容量
private int mQueueLength; //隊列長度
private int mFront; //隊頭
private int mRear; //隊尾
public MyQueue(int capacity) {
this.mQueueCapacity = capacity;
mData = new int[capacity];
mQueueLength = 0;
mFront = 0;
mRear = 0;
}
/**
* 清空隊列
*/
public void clearQueue() {
mQueueLength = 0;
mFront = 0;
mRear = 0;
}
/**
* 獲取隊列長度
* @return
*/
public int getQueueLength() {
return mQueueLength;
}
/**
* 隊列是否已滿
* @return
*/
public boolean isQueueFull() {
return mQueueLength == mQueueCapacity;
}
/**
* 隊列是否為空
* @return
*/
public boolean isQueueEmpty() {
return mQueueLength == 0;
}
/**
* 入隊
* @param element
* @return
*/
public boolean enQueue(int element) {
if (isQueueFull()) {
return false;
}
mData[mRear] = element;
mRear = (mRear + 1) % mQueueCapacity;
mQueueLength++;
return true;
}
/**
* 出隊
* @return
*/
public boolean deQueue() {
if (isQueueEmpty()) {
return false;
}
mFront = (mFront + 1) % mQueueCapacity;
mQueueLength--;
return true;
}
/**
* 遍歷隊列
*/
public void queueTraverse() {
for (int i = mFront; i < mFront + mQueueLength; i++) {
int temp = mData[i % mQueueCapacity];
System.out.println(temp);
}
}
/**
* 測試
* @param args
*/
public static void main(String[] args) {
MyQueue q = new MyQueue(5);
q.enQueue(1);
q.enQueue(2);
q.enQueue(33);
q.deQueue();
q.deQueue();
q.queueTraverse();
System.out.println("size = " + q.getQueueLength());
q.enQueue(4);
q.enQueue(5);
q.enQueue(6);
q.enQueue(7);
q.enQueue(7);
q.enQueue(7);
q.queueTraverse();
System.out.println("size = " + q.getQueueLength());
q.clearQueue();
q.enQueue(666);
q.queueTraverse();
}
}
視頻課程:[慕課網]數據結構探險—隊列篇