队列
- 队列是一个有序列表,可以是数组或链表实现。
- 遵循先进先出的原则
环形队列:
数组模拟环形队列
- 思路:通过取模的方式来实现
- 队列为空时front == rear。
- 队列满时(rear + 1)% maxSize == front,rear指针指向的位置实际上是没有存储数据的,所以会浪费一个存储空间。
- 队列中有效数据的个数为(rear + maxSize - front)% maxSize
实现代码:
package com.zxs.circle;
import java.util.Scanner;
/**
* @Classname CircleQueueDemo
* @Description 用数组模拟环形队列
* @Date 2021/5/8 22:34
* @Created by zxs
*/
public class CircleQueueDemo {
public static void main(String[] args) {
//模仿队列叫号的场景
System.out.println("测试数组模拟环形队列的案例");
CircleQueue queue = new CircleQueue(5);
//模拟一个接受用户输入的测试界面
char c;
Scanner sc = new Scanner(System.in);
boolean loop = true;
//输出一个菜单
while (loop) {
System.out.println("-----------------------------------------------");
System.out.println("s(show):显示队列");
System.out.println("a(add):添加数据到队列");
System.out.println("g(get):获取队列中的数据");
System.out.println("h(showHead):显示队列的头数据");
System.out.println("e(exit):退出程序");
System.out.println("-----------------------------------------------");
c = sc.next().charAt(0);
switch (c) {
case 's':
queue.showQueue();
break;
case 'a':
System.out.println("请输入您要添加的数据~~");
int num = sc.nextInt();
queue.addQueue(num);
break;
case 'g':
try {
int rea = queue.getQueue();
System.err.println("取出的数据为:" + rea);
} catch (Exception e) {
System.err.println(e.getMessage());
}
break;
case 'h':
try {
int head = queue.getHead();
System.out.println("头数据为:" + head);
} catch (Exception e) {
System.err.println(e.getMessage());
}
break;
case 'e': //退出程序
sc.close();
loop = false;
break;
default:
break;
}
}
System.out.println("程序退出成功~~~");
}
}
class CircleQueue{
//队列头,指向数组的第一个元素,默认值为0
private int front;
//队列尾,指向数组的尾,默认值为0
private int rear;
//模拟队列的数组
private int arr[];
//数组最大的容量
private int maxsize;
public CircleQueue(int arrMaxSize){
maxsize=arrMaxSize;
arr = new int[maxsize];
}
//判断队列是否为空
public boolean isEmpty(){
return rear == front;
}
//判断队列是否为满。
// 当队列满时,rear指针指向的位置实际上是没有存储数据的,所以会浪费一个数组的存储空间
public boolean isFull(){
return (rear + 1) % maxsize == front;
}
//添加一个数据到队列中
public void addQueue(int data){
//先判断队列是否为满
if (isFull()){
System.out.println("队列已满,无法添加数据!");
return;
}
arr[rear]=data;
rear=(rear + 1)% maxsize;
System.err.println("添加成功~~~");
}
//从队列中获取一个数据,出队列
public int getQueue(){
//先判断是否为空
if (isEmpty()){
throw new RuntimeException("队列为空,无数据出队列!");
}
int value = arr[front];
front = (front + 1) % maxsize;
return value;
}
//获取队列中的头数据
public int getHead(){
//判断队列是否为空
if (isEmpty()){
throw new RuntimeException("队列为空,无头数据!");
}
return arr[front];
}
//显示队列中所有的数据
public void showQueue(){
if (isEmpty()){
System.out.println("队列为空~~~");
}
for (int i = front; i <=front + getSize(); i++) {
System.out.println("arr["+i+"]="+arr[i % maxsize]);
}
}
//获取队列中有效数据的个数
public int getSize(){
return (rear + maxsize - front) % maxsize;
}
}
链表模拟环形队列
- 思路:用环形链表实现即可。