<數據結構-隊列>

  今天咱們學習數據結構中的隊列數組

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();
    }
}

測試結果:

相關文章
相關標籤/搜索