<数据结构-队列>
今天我们学习数据结构中的队列
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(); } }
测试结果: