隊列概念
隊列(Queue)是限定只能在一端插入、另一端刪除的線性表。允許刪除的一端叫做隊頭(front),允許插入的一端叫做隊尾(rear),沒有元素的隊列稱為“空隊列”。
隊列具有先進先出(FIFO)的特性。
普通順序隊列存在的問題
在普通順序隊列中,入隊的操作就是先將尾指針rear右移一個單位,然后將元素值賦值給rear單位。出隊時,則是頭指針front后移一個單位。像這樣進行了一定數量的入隊和出隊操作后,可能會出現這樣的情況:
尾指針rear已指到數組的最后有一個元素,即rear==MaxLen-1,此時若再數組的前面部分可能還有很多閑置空間,即這種溢出並非是真的沒有可用的存儲空間,故稱這種溢出現象為“假溢出”。顯然,必須要解決這一塊假溢出的問題,否則順序隊列就沒有太多使用價值。
循環隊列
循環隊列的存儲結構,頭、尾指針都和普通順序隊列相同。不同的只是將隊列視為“環狀結構”,即data[0]為緊接着data[MaxLen-1]的單元,為相鄰的元素,首位成為一個環。結構如下:(來自:百科)
代碼實現
全局變量:定義隊列長度
static int MaxLen;
循環隊列基本數據結構的實現:
static class myQueue{ int front; int rear; int queueList[]; public myQueue() { // TODO Auto-generated constructor stub queueList=new int[MaxLen]; front=0; rear=0; } }
判空函數
public boolean isEmpty() { if(front==rear){ return true; } return false; }
判滿函數
public boolean isFull(){ if(((rear+1)%MaxLen)==front){ return true; } else{ return false; } }
取隊頭元素
public void queueFront(int getFront){ if(isEmpty()==false){ getFront=queueList[(front+1)%MaxLen]; } else { System.out.println("ERROR:Queue is Empty"); return; } }
入隊
public void enQueue(int enData) { if(isFull()==false){ rear=(rear+1)%MaxLen; this.queueList[rear]=enData; } else{ System.out.println("ERROR:Queue is Full"); return; } }
出隊
public void outQueue() { if(isEmpty()==false){ front=(front+1)%MaxLen; } else { System.out.println("ERROR:Queue is Empty"); return; } }