今天咱們學習數據結構中的隊列數組
1,什麼是隊列呢數據結構
就是數據成隊的排列着,像你去火車站買票,你的排隊吧,輪到你了才能買票,你排這個隊就叫着隊列。dom
2,隊列的做用ide
有效,有次序的管理數據,先排隊的先買票,後來排隊的後買票(FIFO).--------先進先出學習
3,隊列特性測試
a,本質就是數組。this
b,後來的元素,只能放在當前隊列最後一個元素的後面,若是隊列滿了,將不能在向隊列中添加元素spa
c,每次取出數據都是,取隊列的第一個元素。設計
3,隊列分類指針
a,普通隊列:1,就是你去買票排隊,買到票的人,退出這個隊列,後面這我的向前走一個,再後依次向前走。(缺點:數據大量的移動,形成沒必要要的cpu消耗,影響程序執行效率)
2,隊列不變,賣票的人賣給第一位後,走向第二位,而後依次走向最後一位。(缺點:執行過的數據,任然在隊列和內存中,只能靠擴展隊列長度來容納更多元素,形成大量空間浪費)
b,環形隊列:利用普通隊列1和2結合,有效的解決了以隊列的缺點,隊列構成了一個圓環,當添加元素到隊列時,向後排;當取出隊列時也向後移動,當添加元素到隊列的最末端時,將又從隊列頭開始添加數據。。。。
4,代碼實現環形隊列
1 //環形隊列設計 2 class Queue{ 3 int qHead;//頭指針 4 int qEnd;//尾指針 5 int qSumSize;//隊列總容量 6 int qCurSize;//隊列中當前有多少個元素 7 int q[];//用於裝隊列元素的數組 8 9 //初始化一個隊列 10 public void createQ(int qSumSize){ 11 this.qHead = 0; 12 this.qEnd = 0; 13 this.qSumSize = qSumSize; 14 q = new int[qSumSize]; 15 } 16 //清楚隊列中元素 17 public void delQ(){ 18 this.qHead = 0; 19 this.qEnd = 0; 20 q = null; 21 } 22 //得到隊列總容量 23 public int getQsize(){ 24 return this.qSumSize; 25 } 26 //得到隊列有多少個元素 27 public int getCurQsize(){ 28 return this.qCurSize; 29 } 30 //判斷隊列是否爲空 31 public boolean isEmpty(){ 32 return qCurSize==0?true:false; 33 } 34 //判斷隊列是否裝滿 35 public boolean isFull(){ 36 return qCurSize==qSumSize?true:false; 37 } 38 //添加一個元素到隊列 39 public boolean add(int num){ 40 if(isFull()){ 41 return false; 42 }else{ 43 q[qEnd] = num; 44 qEnd++; 45 qEnd = qEnd%qSumSize; 46 qCurSize++; 47 return true; 48 } 49 } 50 //獲取隊列頭元素 51 public int get(){ 52 int num = 0; 53 if(isEmpty()){ 54 System.out.println("--隊列爲空00"); 55 return num; 56 }else{ 57 num = q[qHead]; 58 qHead++; 59 qHead = qHead%qSumSize; 60 qCurSize--; 61 return num; 62 } 63 } 64 //遍歷隊列中全部元素 65 public void select(){ 66 for(int i=qHead;i<qCurSize+qHead;i++){ 67 System.out.print(q[i%qSumSize]+","); 68 } 69 System.out.println(); 70 } 71 }
測試隊列:
public class YQueue { public static void main(String[] args) { final Queue q = new Queue(); //實例化一個隊列對象 q.createQ(5);//初始化隊列的總容量爲5 new Thread(new Runnable() { @Override public void run() { for(int i=0;i<9;i++){ System.out.println("添加第"+(i+1)+"個元素:"+(q.add(new Random().nextInt(10)+1)==true?"成功":"失敗")); //當向隊列中插入第6個元素時,隊列滿了,就應該不能插入因此,那麼咱們就取出一個元素,再插入 if(i==6){ System.out.println("得到元素:"+q.get()); } q.select(); } } }).start(); } }
測試結果: