队列详解及java实现

小说:罗李华谈八字算命之改运与补运作者:王开更新时间:2019-03-24字数:62914

泰坦擦了擦眼泪,“少主,虽然我不知道主人为什么没有将自己的身份告诉你。但我可以肯定,我是不会认错人的。别的能错,但武魂会错么?我问你,你的蓝银草武魂是继承于何人的?”

如何应该孩子的负面情绪

紫阳真人道:“几年前小仙去赴龙华会,正好从此经过,见观音坐骑金毛?暝诖肆硕弦蚬??ǹ纸鹗ス?锬锉荤枞瑁?惺?寺祝?憬?宜嫔肀ξ镂宀首匾赂?私鹗ス?锬铮?┥洗艘拢?砩媳闵?敬蹋?煞鹉呀?!
卢奂和裴遵庆是世交”是少数几个尊重裴遵庆的大臣之一,裴遵庆被刺杀后”卢奂三次上书政事堂,呼吁由刑部、大理寺、御史台成立联合调查司,彻底查清刺杀案真相,但他所希望的联合调查司没有能成立,也无法成立,所有的证据和证人都被李庆安的内卫拿走,他们就无从调查。

“好,果然是江湖前辈,豪气爽快,我喜欢,就这样,从现在起,咱们就是一家子了,联手起来一起打鬼子。”韩非急忙说道,朝身边的一个参谋一挥手,对他耳语了几句。那个参谋频频点头,立刻跑出去了。

队列详解及java实现


导读

  栈和队列是有操作限制的线性表。

目录

1、队列的概念、特点、存储结构。

2、栈队列的java实现。

概念

  队列是一种在一端进行插入,而在另一端进行删除的线性表。
1、队列的插入端称为队尾;队列的删除端称为队头。(好比火车进隧道)
2、队列的插入操作称为入队(push),删除操作称为出队(pop)。

特点

  队列就像一列进入隧道的火车,隧道就是队列,火车车厢就是元素,进入隧道就是从隧道的这头(队尾)插入元素,出隧道就是从隧道的另一头(队头)删除元素。所以是“先进先出”的特点。

存储结构

  类似栈有顺序队和链式队两种。

java实现

  我们可以围绕栈的4个元素来实现队列:

2状态:是否队空;是否队满。

2操作:进队push;出队pop。

顺序队的实现

   顺序队列的实现也可以使用数组来完成,同栈的实现一样,只是栈是在同一端进行压栈和进栈操作,而队列是在一端做push,另一端做pop操作。

可以看一下下面的队列操作示意图:

 

   我们在实现顺序栈时使用头指针“front”和尾指针“rear”分别进行出队和入队操作,但普通的队列如上图所示,会发生“假溢出”现象,所以我们通常将数组弄成一个环状,即队头和队尾相连,这样就形成了“循环队列”,同时也解决了“假溢出”现象。循环队列是改进版的顺序队列。

  如图:

 

  对于普通队列的push或pop我们只需要对尾指针或头指针进行自增操作即可,但是循环队列我们就不能单纯的进行自增,当front或rear=maxSize-1时我们就不能进行自增操作了,比如一个队列尾长度为4的数组datas[4],那么当front或rear需要在0,1,2,3之间进行循环“推进”,以此达到循环队列的效果。所以我们可以使用rear = (rear+1)%maxSize ;front = (front+1)%maxSize ;公式进行指针计算。

  需要注意的是:队空状态的条件为:front = rear。而如果整个队列全部存满数据那么,队满的条件也是front = rear;所以循环队列需要损失一个存储空间,如下图:

 

 

  解决了这些问题我们就可以很轻松地实现循环队列了:

 

 1 package test;
 2 
 3 public class SqQueue<T>{
 4     private T[] datas;//使用数组作为队列的容器
 5     private int maxSize;//队列的容量
 6     private int front;//头指针
 7     private int rear;//尾指针
 8 
 9     //初始化队列
10     public SqQueue(int maxSize){
11         if(maxSize<1){
12             maxSize = 1;
13         }
14         this.maxSize = maxSize;
15         this.front = 0;
16         this.rear = 0;
17         this.datas = (T[])new Object[this.maxSize];
18     }
19 
20     //两个状态:队空&队满
21     public boolean isNull(){
22         if(this.front == this.rear)
23             return true;
24         else
25             return false;
26     }
27 
28     public boolean isFull(){
29         if((rear+1)%this.maxSize==front)
30             return true;
31         else
32             return false;
33     }
34 
35     //初始化队列
36     public void initQueue(){
37         this.front = 0;
38         this.front = 0;
39     }
40 
41     //两个操作:进队&出队
42     public boolean push(T data){
43         if(isFull())
44             return false;//队满则无法进队
45         else{
46             datas[rear] = data;//进队
47             rear = (rear+1) % maxSize;//队尾指针+1.
48             return true;
49         }
50     }
51     public T pop(){
52         if(isNull())
53             return null;//对空无法出队
54         else{
55             T popData = datas[front++];//出队
56             front = (front+1) % maxSize;//队头指针+1
57             return popData;
58         }
59     }
60 
61     //get()
62     public T[] getDatas() {
63         return datas;
64     }
65 
66     public int getMaxSize() {
67         return maxSize;
68     }
69 
70     public int getFront() {
71         return front;
72     }
73 
74     public int getRear() {
75         return rear;
76     }
77 }

 

  测试:

我要说两句: (0人参与)

发布