Java數據結構與算法_隊列
一、隊列介紹
隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱爲隊尾,進行刪除操作的端稱爲隊頭。
二、單向隊列的實現
/**
* @Author: slx
* @Date: 2019/5/10 15:44
*/
public class ShuQueue {
private Object[] queueArray;
//隊列總大小
private int maxSize;
//對頭
private int front;
//隊尾
private int rear;
//隊列中元素的實際數目
private int nItems;
public ShuQueue(int s) {
this.maxSize = s;
queueArray = new Object[maxSize];
front = 0;
rear = -1;
nItems = 0;
}
//隊列中新增數據
public void insert(int value) {
if (isFull()) {
System.out.println("隊列已滿!");
}else {
//如果隊列尾部指向頂了,那麼循環回來,執行隊列的第一個元素
if (rear == maxSize -1) {
rear = -1;
}
//隊尾指針加1,然後在隊尾指針插入新的數據
queueArray[++rear] = value;
nItems++;
}
}
//移除數據
public Object remove() {
Object removeValue = null;
if (!isEmpty()) {
removeValue = queueArray[front];
queueArray[front] = null;
front++;
if (front == maxSize) {
front = 0;
}
nItems--;
return removeValue;
}
return removeValue;
}
//查看對頭元素
public Object peekFront() {
return queueArray[front];
}
//判斷隊列是否滿了
public boolean isFull() {
return (nItems == maxSize);
}
//判斷隊列是否爲空
public boolean isEmpty() {
return (nItems == 0);
}
//返回隊列的大小
public int getSize() {
return nItems;
}
}
測試代碼:
/**
* @Author: slx
* @Date: 2019/5/12 20:32
*/
public class ShuQueueTest {
public static void main(String[] args) {
ShuQueue queue = new ShuQueue(5);
queue.insert(1);
queue.insert(2);
queue.insert(3);
queue.insert(4);
queue.insert(5);
System.out.println(queue.peekFront());
queue.remove();
System.out.println(queue.peekFront());
queue.insert(6);
queue.insert(7);
}
}
結果
1
2
隊列已滿!
Process finished with exit code 0
三、優先級隊列(基於數組實現)
/**
* @Author: slx
* @Date: 2019/5/12 20:42
*/
public class ShuPriorityQueue {
private int maxSize;
private int[] priQueueArray;
private int nItems;
public ShuPriorityQueue(int s) {
this.maxSize = s;
priQueueArray = new int[maxSize];
nItems = 0;
}
//插入數據
public void insert(int value) {
int j;
if (nItems == 0) {
priQueueArray[nItems++] = value;
}else {
j = nItems - 1;
//選擇的排序方法是插入排序,按照從大到小的順序排列,越小的越在隊列尾部
while (j >= 0 && value > priQueueArray[j]) {
priQueueArray[j+1] = priQueueArray[j];
j--;
}
priQueueArray[j+1] = value;
nItems++;
}
}
//移除數據,由於是按照從大到小的順序排列的,所以我們移除數據我們指針向下移動
//被移除的地方由於是int類型的,不能設置爲null,這裏的做法是設置爲 -1
public int remove() {
int k = nItems - 1;
int value = priQueueArray[k];
priQueueArray[k] = -1;//-1表示這個位置的數據被移除了
nItems--;
return value;
}
//查看優先級最高的元素
public int peekMin() {
return priQueueArray[nItems-1];
}
//判斷是否爲空
public boolean isEmpty() {
return (nItems == 0);
}
//判斷隊列是否滿了
public boolean isFull() {
return (nItems == maxSize);
}
}