Java實現順序佇列
阿新 • • 發佈:2019-01-28
佇列-操作受限的線性表。進行刪除的一端叫隊頭,進行插入的一端叫隊尾。
順序佇列用順序儲存。刪除隊首元素有兩種方式:
①不要求隊首元素必須在下標為零的陣列元素中;
每次刪除元素只需修改隊首指標的位置,令front=front+1;顯然優點為無須改變佇列元素的位置,缺點為front值隨刪除元素而不斷增加,整個佇列向後移動,隨著隊尾元素的不斷插入,必然會導致陣列後端沒有可用空間的情況,而陣列前端的大量空間卻被閒置。
②要求隊首元素必須在下標為零的陣列元素中;
每次刪除隊首元素,令所有元素元素向前移動一個位置,顯然優點為不浪費空間,缺點為所有元素的地址都要改變,效率低。
為了克服以上缺點,假定陣列是迴圈的,即採用環狀模型來實現佇列。即將佇列在邏輯上置於一個圓環上:
刪除,front順時針移動一個位置;
插入,rear順時針移動一個位置;
環狀佇列實現要求餘運算:
rear=(rear+1)%size;
front=(front+1)%size;
程式碼:
public class AQueue<T> { /** * 隊首所在陣列元素的下標 */ private int front; /** * 隊尾所在陣列元素的下標 */ private int rear; /** * 隊中元素的個數 */ private int count; /** * 存放佇列元素的陣列 */ private Object[] queueArray; /** * 陣列的規模 */ private int size; /** * 構造方法 */ public AQueue(){ this.size=10; this.queueArray=new Object[size]; front=0; rear=0; count=0; } /** * 構造方法 * @param size 陣列大小 */ public AQueue(int size){ this.size=size; this.queueArray=new Object[size]; front=0; rear=0; count=0; } /** * 判斷是否已滿 * @return */ public boolean isFull(){ return count==size; } /** * 判斷是否為空 * @return */ public boolean isEmpty(){ return count==0; } /** * 在隊尾插入data為item的元素 * @param item 資料域 * @return 成功返回true */ public boolean insert(T item){ if(isFull()){ System.out.println("full queue"); return false; } queueArray[rear]=item; rear=(rear+1)%size;//修改隊尾指標 count++; return true; } /** * 刪除隊首元素 * @return 返回隊首元素值 */ public T delete(){ if(isEmpty()){ throw new RuntimeException("empty queue"); } T item=(T)queueArray[front]; front=(front+1)%size; count--; return item; } /** * 得到隊首元素值 * @return */ public T getFront(){ if(isEmpty()){ throw new RuntimeException("empty queue"); } return (T)queueArray[front]; } /** * 清空佇列 */ public void clear(){ front=rear=count=0; } //測試 public static void main(String[] args){ AQueue<Integer> aqueue=new AQueue<Integer>(); aqueue.insert(1); aqueue.insert(2); aqueue.insert(3); aqueue.insert(4); aqueue.delete(); System.out.println(aqueue.getFront()); aqueue.delete(); System.out.println(aqueue.getFront()); aqueue.delete(); System.out.println(aqueue.getFront()); aqueue.delete(); System.out.println(aqueue.getFront()); } }