队列介绍
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
- 队列是一个有序列表,可以用数组或者链表来实现
- 遵循先入先出的原则。
用数组来模拟循环队列
队列本身是有序队列,若使用数组的结构来存储队列的数据,有一下声明。
maxSize
数组的最大长度。为用户定义。
front
队列的头,初始化为0。
rear
队列的尾,初始化为0. 即rear所在的位置是没有元素的。
很明显当front=rear时,队列中是没有元素的。
我们假定预留一个位置。即存储的最大个数为maxSize-1. 即当front指向0,rear指向maxSize-1时(注意下标从0开始),队列满了,由此可见队列为满的条件为**(rear+1)%maxSize = front % maxSize**
CilecreArrayQenen 类
package ArrayQueue;
import java.util.Arrays;
//使用数组模拟队列,编写一个ArrayQueue类
public class CircleArrayQueue {
private final int maxSize;
private int front;
private int rear;
private int[] arr;
//创建队列的构造器
public CircleArrayQueue(int size){
maxSize = size;
arr = new int[maxSize];
front = 0;
rear = 0;
}
//判断队列是否为满
public boolean isFull(){
return (rear+1)% maxSize == front % maxSize;
}
//判断队列是否为空
public boolean isEmpty() {
return front == rear;
}
//添加数据到队列
public void addQueue(int n){
if (isFull()){
System.out.println("队列已满");
return;
}
arr[rear] = n ;
rear=(rear+1)%maxSize;
}
//获取队列的数据,出队列
public int getQueue(){
if (isEmpty()){
throw new RuntimeException("队列中没有元素");
}
int p = arr[front];
arr[front] = 0;
front=(front+1)%maxSize;
return p;
}
//显示队列的所有数据
public void showQueue(){
if (isEmpty()){
System.out.println("队列为空");
return;
}
System.out.println(Arrays.toString(arr));
}
//显示队列的头数据,注意不是取出数据
public void showHeadData(){
if (isEmpty()){
System.out.println("队列为空");
return;
}
System.out.println(arr[front]);
}
//
}
测试类
package ArrayQueue;
import java.util.Scanner;
public class ArrayQueueDemo {
public static void main(String[] args) {
// ArrayQueue queue = new ArrayQueue(3);
CircleArrayQueue queue = new CircleArrayQueue(3);
char key;
Scanner sc = new Scanner(System.in);
boolean loop = true ;
while (loop){
System.out.println(" 菜单 ");
System.out.println("s:显示队列");
System.out.println("a:添加元素");
System.out.println("e:退出程序");
System.out.println("g:从队列取元素");
System.out.println("h:查看队列头元素");
key = sc.next().charAt(0);
switch (key){
case 's':
queue.showQueue();
break;
case 'a':
System.out.print("请输入一个数:");
int num = sc.nextInt();
queue.addQueue(num);
break;
case 'e':
sc.close();
loop = false;
System.out.println("程序退出");
break;
case 'g':
try {
int number = queue.getQueue();
System.out.println("取出的数据是"+number);
}catch (RuntimeException e){
System.out.println(e.getMessage());
}
break;
case 'h':
queue.showHeadData();
break;
default:
break;
}
}
}
}