1. 程式人生 > >JAVA基礎(66)---佇列

JAVA基礎(66)---佇列

佇列

是一種先進先出(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());
		
	}
}