JAVA基礎(66)---佇列
阿新 • • 發佈:2018-11-20
佇列
是一種先進先出(FIFO)的線性表,只能在表的一端(隊尾)進行插入,在另一端(隊頭)進行刪除運算的線性表。
邏輯結構:與線性表相同,仍為一對一關係
儲存結構:用順序佇列或鏈隊儲存均可
運算規則:先進先出(FIFO)
實現方式:關鍵是編寫入隊和出隊的函式,具體實現 依順序對或鏈隊的不同而不同
實現
線性表有順序儲存和鏈式儲存,佇列是一種特殊的線性表,同樣也存在這兩種儲存方式。
解決假溢位:順序迴圈佇列
如何判斷迴圈佇列究竟是空的還是滿的
現在問題又來了,我們之前說,空佇列時,front指標等於rear指標,那麼現在迴圈佇列滿的時候,也是front等於rear,那麼如何判斷迴圈佇列究竟是空的還是滿的?有如下辦法:
辦法1:設定一個標誌位flag。初始時置flag=0;每當入佇列操作成功就置flag=1;每當出佇列操作成功就置flag=0。則佇列空的判斷條件為:rear == front && flag==0;佇列滿的判斷條件為:rear = = front && flag= =1。
辦法2:保留一個元素的儲存空間。此時,佇列滿時的判斷條件為 (rear + 1) % maxSize == front;佇列空的判斷條件還是front == rear。
辦法3:設計一個計數器count,統計佇列中的元素個數。此時,佇列滿的判斷條件為:count > 0 && rear == front ;佇列空的判斷條件為count == 0。
佇列的常用操作
入隊、出隊(返回隊首元素並且刪除隊首元素)、判斷佇列是否已滿、判斷佇列是否為空、獲取隊首元素(只是獲取隊首元素,但不刪除)
實現程式碼
package org.lanqiao.queue; /* * 介面:針對佇列操作的規範 */ public interface IQueue { /* * 入隊 */ public void inputQueue(Object obj); /* * 出隊 */ public Object outputQueue(); /* * 判斷佇列是否已滿 */ public boolean isMax(); /* * 判斷佇列是否為空 */ public boolean isEmpty(); /* * 獲取隊首元素 */ public Object getQueueFront(); }
package org.lanqiao.queue;
public class Queue implements IQueue{
private int front = 0 ;//隊首標記
private int rear = 0;//隊尾標記
private int size = 0;//佇列中元素的個數
private Object[] que;//佇列的底層本質
private int capacity = 10;//佇列的預設容量
public Queue() {
que = new Object[capacity];
}
public Queue(int capacity) {
que = new Object[capacity];
this.capacity = capacity;
}
@Override
public void inputQueue(Object obj) {
//判斷佇列是否已滿
if(isMax()) {
System.out.println("佇列已滿");
return;
}
rear = (rear + 1)%capacity;
if(rear == 0) {
rear = 1;
}
que[rear] = obj;
size++;
}
@Override
public Object outputQueue() {
if(!isEmpty()) {
front = (front + 1 )%capacity;
if(front==0) {
front = 1;
}
size--;
return que[front];
}
System.out.println("佇列為空");
return null;
}
/*
* 辦法2:保留一個元素的儲存空間。
* 此時,佇列滿時的判斷條件為 ( rear + 1) % maxSize == front;
* 佇列空的判斷條件還是front == rear
*/
@Override
public boolean isMax() {
return (size + 1) == capacity;
}
@Override
public boolean isEmpty() {
return front == rear;
}
@Override
public Object getQueueFront() {
return que[front + 1];
}
public void print() {
for(int i = 1 ; i <capacity; i++) {
System.out.println(que[i]);
}
}
}
package org.lanqiao.queue;
public class Test {
public static void main(String[] args) {
Queue q = new Queue(5);
q.inputQueue("1");
q.inputQueue("2");
q.inputQueue("3");
q.inputQueue("4");
q.inputQueue("5");
q.print();
System.out.println("---------------");
System.out.println(q.outputQueue());
System.out.println(q.outputQueue());
System.out.println(q.getQueueFront());
q.inputQueue("5");
q.inputQueue("6");
System.out.println("---------------");
q.print();
System.out.println(q.getQueueFront());
}
}