数据结构之队列
1.队列介绍
队列是一个有序列表,可以用数组或是链表来实现。
遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出
示意图:
[外链图片转存失败(img-DW8W0yTX-1568539021698)(D:\学习笔记\img15.png)]
当我们将数据存入队列时称为”addQueue”,addQueue 的处理需要有两个步骤:
思路分析
1)将尾指针往后移:rear+1 , 当front == rear 【空】
2)若尾指针 rear 小于队列的最大下标 maxSize-1,则将数据存入 rear所指的数组元素中,否则无法存入数据。 rear == maxSize - 1[队列满]
1.rear 是队列最后[含]
2.front 是队列最前元素[不含]
代码实现如下:
public class ArrayQueue {
private int maxSize;//表示数组的最大容量
private int front;//队列头
private int rear;//队列尾
private int[] arr;//用于存放数据模拟队列
public ArrayQueue(int arrMaxSize) {
this.maxSize = arrMaxSize;
arr = new int[maxSize];
front = -1;//指向队列头部,分析出front是指向队列头的前一个位置
rear = -1;//指向队列尾,就是指向最后一位的数据
}
//判断队列是否为空
public boolean isFull(){
return rear==maxSize-1;
}
//判断队列是否满了
public boolean isEmpty(){
return rear==front;
}
//添加数据到队列
public void addQueue(int n){
if(isFull()){
System.out.println("队列满,不能加入数据");
return;
}
rear++;//让rear后移。
arr[rear] = n;
}
public int getQueue(){
if(isEmpty()){
throw new RuntimeException("队列空,不能去数据");
}
front++;//后移
return arr[front];
}
//显示队列的所有数据
public void showQueue(){
if(isEmpty()){
System.out.println("队列空的,没有数据");
return;
}
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
//显示队列头数据,不是取出头数据
public int headQueue(){
if(isEmpty()){
throw new RuntimeException("队列空,没有头数据");
}
return arr[front+1];
}
}
数组模拟循环队列
对前面的数组模拟队列的优化,充分利用数组.因此将数组看做是一个环形的。(通过取模的方
式来实现即可)
分析说明:
1)尾索引的下一个为头索引时表示队列满,即将队列容量空出一个作为约定,这个在做判断队列满的
时候需要注意 (rear + 1) % maxSize == front 满]
2)rear == front [空]
3)思路
[外链图片转存失败(img-KqRZOPYA-1568539021699)(D:\学习笔记\img16.png)]
代码:
public class CircleQueue {
private int maxSize;//表示数组的最大容量
private int front;//队列头,就是指向队列的第一个元素.也就是说arr[front]就是队列的第一个元素。
private int rear;//队列尾,rear指向队列的最后一个元素的后一个位置。因为希望空出一个空间最为约定。
private int[] arr;//用于存放数据模拟队列
public CircleQueue(int arrMaxSize) {
this.maxSize = arrMaxSize;
arr = new int[maxSize];
}
//判断队列是否满了
public boolean isFull(){
return (rear+1)%maxSize==front;
}
//判断队列是否为空
public boolean isEmpty(){
return rear==front;
}
//添加数据到队列
public void addQueue(int n){
if(isFull()){
System.out.println("队列满,不能加入数据");
return;
}
arr[rear] = n;
rear=(rear+1)%maxSize;//让rear后移。
}
//获取队列数据,出队列
public int getQueue(){
if(isEmpty()){
throw new RuntimeException("队列空,不能去数据");
}
int value = arr[front];
front = (front+1)%maxSize;//后移
return value;
}
//求当前队列中元素的个数
public int size(){
return (rear+maxSize-front)%maxSize;
}
//显示队列头数据,不是取出头数据
public int headQueue(){
if(isEmpty()){
throw new RuntimeException("队列空,没有头数据");
}
return arr[front];
}
//显示队列的所有数据
public void showQueue(){
if(isEmpty()){
System.out.println("队列空的,没有数据");
return;
}
for(int i=front;i<front+size();i++){
System.out.println(i%maxSize);
}
}
}