队列是一种基本的数据结构具有FIFO的特性(先进先出),下面是数组实现队列
一.静态数组实现队列
实现队列中需要定义的变量,头指针front,数组的大小maxsize,数组array,尾指针rear
在java中的定义如下
public class ArrayQueen {
//数组最大长度
private int maxsize;
//队列头指针
private int front;
//队列尾指针
private int rear;
//数组实现队列
private int[] arr;
}
初始化时,头指针和尾指针相等,即 front = rear = -1,在java中可以在类的构造方法中完成变量的初始化。
//用构造方法实现队列的初始化
public ArrayQueen(int maxsize){
this.maxsize = maxsize;
front = -1 ;
rear = -1 ;
this.arr = new int[maxsize];
}
接下来,为了方便操作可以让头指针指向第一个元素的前一个位置,尾指针指向最后一个元素
判断队列为空的条件是:尾指针等于头指针即rear = = front
判断队列为满的条件是:尾指针指向数组最大长度减一,即rear == maxsize - 1(这里的数组是从下标为零开始的)
增加元素时:尾指针后移一位,再将数值赋给尾指针指向的位置,即arr[++rear] = 数值
删除元素时:头指针后移一位,再返回头指针指向的元素,即 return arr[++front];
ps:我这里的操作都是基于头指针指向第一个元素的前一个位置,尾指针指向最后一个元素的情况
在java中的实现如下
//判断队列是否为满
public boolean isFull(){
if (rear == (maxsize - 1)){
return true;
}
return false;
}
//判断队列是否为空
public boolean isEmpty(){
if (rear == front){
return true;
}
return false;
}
//先判断队列是否为满,再添加元素
public void add(int num){
if (isFull()){
System.out.println("队列为满,不可添加");
return;
}
arr[++rear] = num ;
}
//先判断队列是否为空,在进行取数字
public int getNum(){
if (isEmpty()){
throw new RuntimeException("队列为空,不可取数字");
}
return arr[++front];
}
//取头部数字
public void queryHead(){
if (isEmpty()){
throw new RuntimeException("队列为空,不可取数字");
}
System.out.println("头部的数字为:" + arr[++front]);
}
//查询队列中的元素
public void query(){
System.out.print("队列中的元素有:");
for (int i = 0; i < arr.length; i++) {
System.out.print("\t" + arr[i]);
}
}
二.静态数组实现循环队列
由于静态数组的局限性,无法对数组的空间完美利用,所以就出现了循环队列,实现循环队列的方法很多,我这里写的是牺牲数组中的一个存储空间实现循环队列的方法
循环队列同样是用静态数组实现的,只不过在其中加入了取余操作,使其成为了一个环状,在其中同样需要定义数组,数组的最大长度,头指针和尾指针,只不过初始化时头指针与尾指针都指向了数组0的位置,即 rear = front = 0;
接下来的操作都是基于头指针指向数组的第一个元素位置,而尾指针指向数组的最后一个元素的后一个位置,并在数组中空出一个位置且这个位置不可添加元素,如图所示
队列中的元素个数:(rear + maxsize - front)% maxsize
判断队列为满:(rear + 1)% maxsize == front
判断队列为空: rear == front
增加元素:将需要添加的数值赋给rear指针所指的位置,然后(rear+1)即,arr[rear] = 数值;
rear++;
删除元素:将front指针所指的元素赋值给一个变量,然后(front+1),之后在返回这个变量
即: num = rear[front];
front++;
return num;