(示意图)

关于队列,首先要知道队列的特点
1)队列是一个有序列表,可以用数组或链表来实现,本章用数组实现
2)遵循先进先出的原则,既:先存入的数据先取出,后存入的数据后取出
3)示意图(上图)
所以,首先要创建队列,并初始化其属性
class aQueue{
private int maxSize;//队列的最大容量
private int rear;//队列尾
private int front;//队列头
private int[] arr;//数组本身
public aQueue(int arrMaxSize){
maxSize = arrMaxSize;
front = -1;//指向队列头部,分析出front是指向队列头的前一个位置
rear = -1;//指向队列尾,指向队列尾的数据本身(即就是队列最后一个数据)
arr = new int[maxSize];
}
}有一个问题→为什么front和rear都指向-1呢,可以换种方法理解,在编程语言里,通常都用0作为某个存储体的第一个元素,比如java数组arr[0]表示第一个数,所以这里队头和队尾都指向-1,表示还没有数据
初始化完队列,接下来就要其中的几个重要方法了
//判断队列是否为空
public boolean isEmpty(){
return front == rear;
}
//判断队列是否满
public boolean isFull(){
return rear== (maxSize - 1);
}
//入队
public void setQueue(int value){
if (isFull()){
System.out.println("队列已满,不能入队!");
return;
}
rear++;
arr[rear] = value;
//也可以用一步实现 arr[++rear] = value;
}
//出队
public int outQueue(){
if (isEmpty()){
throw new RuntimeException("队列空,不能取数据!");
}
return arr[++front];
}
这里解释几个问题
1. 为什么判断为空的条件是 front == rear?
可以根据最上面的示意图来看,当入队时,队尾(rear)指向的是当前元素,假设入队4个元素,出队4个元素,当所有全部出队的时候,恰好rear == front。
2.判断队满的条件为 rear = maxSize - 1
rear指向的是当前元素,而队列是从0到maxSize -1,当rear指向maxSize-1,也就指向了队列最后一个元素了,此时队满
3.入队要实现rear++, arr[rear] = value;
在入队方法里,先判断是否为空,如果不为空,执行rear++, arr[rear] = value; 先让队尾指针+1,再存入数据,换句话说,入队的时候要把新进来的数据存放到当前rear指向的位置的下一个位置,所以要让rear先加1,再把数据存入
问题分析并优化
1)目前数组使用一次就不能用,没有达到复用的效果
2)这个数组使用算法,该进程一个环形队列,算法的关键是取模,具体问题将在下章更新
最后,附上简单小源码
package com.queue;
public class ArrayQueue {
public static void main(String[] args) {
aQueue a = new aQueue(5);
a.setQueue(10);
a.setQueue(20);
a.setQueue(30);
a.setQueue(40);
a.setQueue(50);
System.out.println(a.outQueue());
System.out.println(a.outQueue());
System.out.println("队头为:" + a.headQueue());
}
}
class aQueue{
private int maxSize;//队列的最大容量
private int rear;//队列尾
private int front;//队列头
private int[] arr;//数组本身
public aQueue(int arrMaxSize){
maxSize = arrMaxSize;
front = -1;//指向队列头部,分析出front是指向队列头的前一个位置
rear = -1;//指向队列尾,指向队列尾的数据本身(即就是队列最后一个数据)
arr = new int[maxSize];
}
//判断队列是否为空
public boolean isEmpty(){
return front == rear;
}
//判断队列是否满
public boolean isFull(){
return rear== (maxSize - 1);
}
//入队
public void setQueue(int value){
if (isFull()){
System.out.println("队列已满,不能入队!");
return;
}
arr[++rear] = value;
}
//出队
public int outQueue(){
if (isEmpty()){
throw new RuntimeException("队列空,不能取数据!");
}
return arr[++front];
}
//查看头数据
public int headQueue(){
if (isEmpty()){
throw new RuntimeException("队列为空");
}
return arr[front+1];
}
}有什么问题欢迎在下方留言,侵删。
版权声明:本文为qq_53387695原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。