<数据结构-队列>

  今天我们学习数据结构中的队列

1,什么是队列呢

  就是数据成队的排列着,像你去火车站买票,你的排队吧,轮到你了才能买票,你排这个队就叫着队列。

2,队列的作用

  有效,有次序的管理数据,先排队的先买票,后来排队的后买票(FIFO).--------先进先出

3,队列特性

  a,本质就是数组。

  b,后来的元素,只能放在当前队列最后一个元素的后面,如果队列满了,将不能在向队列中添加元素

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

测试结果:

原文地址:https://www.cnblogs.com/sanhuan/p/7346748.html