1.什麼是隊列
隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱爲隊尾,進行刪除操作的端稱爲隊頭。
每次在隊尾插入一個元素是,rear增1;刪除一個元素時front增一。
2.隊列的分類
隊列可以劃分爲順序隊列,循環隊列
順序隊列就是建立順序隊列結構必須爲其靜態分配或動態申請一片連續的存儲空間,不過順序隊列有個致命的缺陷就是尾指針和頭指針都會不斷增長造成空間的大量冗餘(就好比用數組來存,指針不斷後移,不回頭那種,就會造成前面的空間浪費)
循環隊列就是把數組看成一個環形(FBI WARNING 此方法很6),在實際使用隊列時,爲了使隊列空間能重複使用,往往對隊列的使用方法稍加改進:無論插入或刪除,一旦rear指針增1或front指針增1 時超出了所分配的隊列空間,就讓它指向這片連續空間的起始位置。自己真從MaxSize-1增1變到0,可用取餘運算rear%MaxSize和front%MaxSize來實現。這實際上是把隊列空間想象成一個環形空間,環形空間中的存儲單元循環使用,用這種方法管理的隊列也就稱爲循環隊列。
除了一些簡單應用之外,真正實用的隊列是循環隊列,在循環隊列中,當隊列爲空時,有front=rear,而當所有隊列空間全佔滿時,也有front=rear。爲了區別這兩種情況,規定循環隊列最多只能有MaxSize-1個隊列元素,當循環隊列中只剩下一個空存儲單元時,隊列就已經滿了。因此,隊列判空的條件時front=rear,而隊列判滿的條件時front=(rear+1)%MaxSize。
這一步關鍵在於理解(rear+1)%MaxSize這個思維,這個思維的關鍵在於是誰追上誰,所以數組中只允許存儲最大長度-1個數據。
package Queue; /* * 隊列 * @author WLNSSS * @time 2017.12.26 * */ public class QueueTest { //實際存儲的數組 private int array[]=null; //頭指針和尾指針 private int head; private int tail; //能存儲的最大長度 private int maxLen; //構造器 public QueueTest() { // TODO Auto-generated constructor stub this(10); } public QueueTest(int len) { array=new int[len]; head=0; tail=0; maxLen=array.length; } //入隊 void add(int data) { //如果入隊不是滿的則入隊 if(isFull()) { System.out.println("Queue full"); } else { array[tail]=data; tail=(tail+1)%maxLen; } } //出隊 void delete() { //如果不是空則出隊 if(isNull()) { System.out.println("isNull"); } else { array[head]=0; head=(head+1)%maxLen; } } //展示隊裏的內容 void display() { for(int i=0;i<3;i++) { System.out.println(array[i]+"head:"+head+"tail"+tail); } } Boolean isFull() { if((tail+1)%maxLen ==head) { return true; } return false; } Boolean isNull() { if(head==tail) { return true; } return false; } public static void main(String[] args) { QueueTest qt = new QueueTest(3); qt.add(5); qt.add(10); qt.delete(); qt.add(10); qt.add(10); qt.delete(); qt.add(3); qt.add(2); qt.delete(); qt.add(2); qt.display(); System.exit(0); } }