队列
1、数组实现队列
1)基本思路
(1)类属性
①数组的最大容量:maxSize
②数组:arr[]
③队头:front 指向队首的前一个元素
④队尾:rear 指向队尾元素
(2)类方法
①判断队列是否为空
②判断队列是否已满
③入队
④出队
⑤显示队列所有元素
⑥显示队首元素:front+1
2)缺点:数组使用一次就不可再使用,出队列之后数组中空出来的位置无法使用,因此要改进为一个环形队列。
class ArrayQueue{
private int maxSize;
private int arr[];
private int front;
private int rear;
// 构造函数
public ArrayQueue(int arrMaxSize){
maxSize = arrMaxSzie;
arr = new int[maxSize];
front = -1;
rear = -1;
}
// 判断队列是否为空
public boolean isEmpty(){
return rear == front;
}
// 判断队列是否已满
public boolean isFull(){
return rear == maxSize - 1;
}
// 入队
public void addQueue(int value){
if(isFull()){
System.out.println("队列已满");
}
rear++;
arr[rear] = value;
}
// 出队
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.printf("arr[%d] = %d\n", i, arr[i]);
}
}
// 显示队首元素
public int headQueue(){
if(isEmpty()){
throw new RuntimeException("队列为空");
}
return arr[front + 1];
}
}
2、数组实现环形队列
1)基本思路
(1)类属性
①数组的最大容量:maxSize(注意数组的容量要比队列长度大1)
②数组:arr[]
③队头:front 指向队首元素
④队尾:rear 指向队尾的后一个位置
(2)类方法
①判断队列是否为空:rear == front
②判断队列是否已满:(rear + 1) % maxSize == front
③入队
④出队
⑤队列中有效元素个数:(rear - front + maxSize) % maxSize
⑥显示队列所有元素
⑦显示队首元素:front
⑧显示队尾元素:(rear - 1 + maxSize) % maxSize
class CycleArrayQueue{
private int maxSize;
private int arr[];
private int front;
private int rear;
// 构造函数
public CycleArrayQueue(int arrMaxSize){
maxSize = arrMaxSize;
arr = new int[maxSize];
front = 0;
rear = 0;
}
// 判断队列是否为空
public boolean isEmpty(){
return front == rear;
}
// 判断队列是否已满
public boolean isFull(){
return (rear + 1) % maxSize == front;
}
// 入队
public void addQueue(int value){
if(isFull()){
System.out.println("队列已满");
return;
}
arr[rear] = value;
rear = (rear + 1) % maxSize;
}
// 出队
public int getQueue(){
if(isEmpty()){
throw new RuntimeException("队列为空");
}
int tmp = arr[front];
front = (front + 1) % maxSize;
return tmp;
}
// 队列中有效元素个数
public int size(){
return (rear - front + maxSize) % maxSize;
}
// 显示队列所有元素
public void showQueue(){
if(isEmpty()){
System.out.println("队列为空");
return;
}
for(int i = front; i < front + size(); i++){
System.out.printf("arr[%d] = %d\n", i % maxSize, arr[i % maxSize]);
}
}
// 显示队首元素
public int headQueue(){
if(isEmpty()){
throw new RuntimeException("队列为空");
}
return arr[front];
}
// 显示队尾元素
public int rearQueue(){
if(isEmpty()){
throw new RuntimeException("队列为空");
}
return arr[(rear - 1 + maxSize) % maxSize];
}
}