迴圈佇列(java實現)
阿新 • • 發佈:2019-01-27
package com.fcy.dataStruct; import java.util.Arrays; class LoopQueue<T>{ private int DEFAULT_SIZE=10; //儲存陣列的長度 private int capacity; //定義一個數組用於儲存迴圈佇列的元素 private Object[] elementData; //儲存迴圈佇列中元素的當前個數 private int front=0; private int rear=0; //以預設陣列長度建立空迴圈佇列 public LoopQueue(){ capacity=DEFAULT_SIZE; elementData=new Object[capacity]; } //以一個初始化元素來建立迴圈佇列 public LoopQueue(T element){ this(); elementData[0]=element; rear++; } //以指定長度的陣列來建立迴圈佇列 public LoopQueue(T element,int initSize){ this.capacity=initSize; elementData=new Object[capacity]; elementData[0]=element; rear++; } //獲取迴圈佇列的大小 public int length(){ if(empty()){ return 0; } return rear>front ? rear-front:capacity-(front -rear); } //插入佇列 public void add(T element){ if(rear==front && elementData[front]!=null){ throw new IndexOutOfBoundsException("佇列已滿!"); } elementData[rear++]=element; //如果rear到頭,就轉頭 rear=rear==capacity? 0:rear; } //移出佇列 @SuppressWarnings("unchecked") public T remove(){ if(empty()){ throw new IndexOutOfBoundsException("佇列已空!"); } //保留佇列的front端元素的值 T oldValue=(T)elementData[front]; //釋放佇列的front端元素 elementData[front++]=null; //如果front已經到頭,那就轉頭 front=front== capacity ? 0:front; return oldValue; } //返回佇列頂元素,但不刪除佇列頂元素 @SuppressWarnings("unchecked") public T element(){ if(empty()){ throw new IndexOutOfBoundsException("佇列已空!"); } return (T)elementData[front]; } //判斷迴圈佇列是否為空 public boolean empty(){ //rear==front且rear處元素為null return rear==front&&elementData[rear]==null; } //清空迴圈佇列 public void clear(){ Arrays.fill(elementData, null); front=0; rear=0; } public String toString(){ if(empty()){ return "[]"; }else{ //如果front<rear,那麼有效元素就是front到rear之間的元素 if(front<rear){ StringBuilder sb=new StringBuilder("["); for(int i=front;i<rear;i++){ sb.append(elementData[i].toString()+","); } int len=sb.length(); return sb.delete(len-1, len).append("]").toString(); }else{ //如果front>=rear,那麼有效元素為front->capacity之間和0->front之間的元素 StringBuilder sb=new StringBuilder("["); for(int i=front;i<capacity;i++){ sb.append(elementData[i].toString()+","); } for(int i=0;i<rear;i++){ sb.append(elementData[i].toString()+","); } int len=sb.length(); return sb.delete(len-1, len).append("]").toString(); } } } } public class LoopQueueTest { public static void main(String[] args) { LoopQueue<String> queue=new LoopQueue<String>("aaaa",3); queue.add("bbbb"); queue.add("cccc"); System.out.println(queue); queue.remove(); System.out.println("刪除一個元素後的佇列:"+queue); queue.add("dddd"); System.out.println(queue); System.out.println("佇列滿時的長度:"+queue.length()); queue.remove(); queue.add("eeee"); System.out.println(queue); } }
執行結果: