队列
1、介绍
2、数组模拟队列
package demo1;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//测试
//创建一个队列
ArrayQueQue queue=new ArrayQueQue(3);
char key=' ';
Scanner scanner=new Scanner(System.in);
boolean loop=true;
//输出一个菜单
while(loop) {
System.out.println("输入的字符是s:显示队列");
System.out.println("输入的字符是e:退出队列");
System.out.println("输入的字符是a:添加数据到队列");
System.out.println("输入的字符是g:从队列取出数据");
System.out.println("输入的字符是h:显示队列头的数据");
key=scanner.next().charAt(0);//接收一个字符
switch (key) {
case 's':
queue.show();
break;
case 'a':
System.out.println("请输入一个数字:");
int value=scanner.nextInt();
queue.addQueQue(value);
break;
case 'g':
try {
int res=queue.getQueQue();
System.out.println("取出的数据值是:"+res);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
break;
case 'h':
try {
int res=queue.headQueQue();
System.out.println("队列的头数据是:"+res);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
break;
case 'e':
scanner.close();
loop=false;
break;
default:
break;
}
}
System.out.println("程序结束!");
}
}
//使用数组模拟队列-编写一个ArrayQueQue类
class ArrayQueQue{
private int maxsize;//表示数组的最大容量
private int front;//队列头
private int rear;//队列尾
private int[] arr;//该数据存放于数组,模拟队列
//创建构造器
public ArrayQueQue(int arrmaxsize){
this.maxsize=arrmaxsize;
arr=new int[maxsize];
front=-1;//指向队列头部
rear=-1;//指向队列的尾部
}
//判断队列是否满
public boolean isFull() {
return rear==maxsize-1;
}
//判断队列是否为空
public boolean isEmpty() {
return rear==front;
}
//添加数据到队列
public void addQueQue(int n) {
//判断队列是否满
if(isFull()) {
System.out.println("队列满,不能加入数据");
return;
}
arr[++rear]=n;//让rear后移
}
//获取队列的数据,出队列
public int getQueQue() {
//判断是否为空
if(isEmpty()) {
//通过抛出异常
throw new RuntimeException("队列是空数据");
}
front++;//front后移
return arr[front];
}
//显示队列的所有数据
public void show() {
//遍历
if(isEmpty()){
System.out.println("队列没有数据");
}
for(int i=0;i<arr.length;i++) {
System.out.println("arr["+i+"]="+arr[i]);
}
}
//显示队列的头数据,注意不是取出数据
public int headQueQue() {
if(isEmpty()) {
throw new RuntimeException("队列没有数据");
}
return arr[front+1];
}
}
数组模拟环形队列
思路(建议大家画个圆形图理解,如果还是不能理解的话,可以看看csdn其他关于环形队列的博客)
- front:front指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素
- rear:rear指向队列的最后一个元素的后一个位置
- 当队列满时,条件是(rear+1)%maxsize=front
- 当队列为空时:rear==front
- rear指针指向待添加数据的元素位置,假设队列内部数组的最大容量为maxsize ,当rear指针指向maxsize -1时,实际该位置上并无数据,因此,队列的最大容量只有maxsize -1,即队列的最大有效数据个数为maxsize -1,因为预留一个位置
- 队列的有效数据个数:(rear+maxsize-front)%maxsize
代码的实现
package demo1;
import java.util.Scanner;
public class demo2 {
public static void main(String[] args) {
// 测试
// 创建一个环形队列
ArrayQueQue queue = new ArrayQueQue(4);//说明设置为4,其队列有效数字最多为3
char key = ' ';
Scanner scanner = new Scanner(System.in);
boolean loop = true;
// 输出一个菜单
while (loop) {
System.out.println("输入的字符是s:显示环形队列");
System.out.println("输入的字符是e:退出环形队列");
System.out.println("输入的字符是a:添加数据到环形队列");
System.out.println("输入的字符是g:从环形队列取出数据");
System.out.println("输入的字符是h:显示环形队列头的数据");
key = scanner.next().charAt(0);// 接收一个字符
switch (key) {
case 's':
queue.show();
break;
case 'a':
System.out.println("请输入一个数字:");
int value = scanner.nextInt();
queue.addQueQue(value);
break;
case 'g':
try {
int res = queue.getQueQue();
System.out.println("取出的数据值是:" + res);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'h':
try {
int res = queue.headQueQue();
System.out.println("队列的头数据是:" + res);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'e':
scanner.close();
loop = false;
break;
default:
break;
}
}
System.out.println("程序结束!");
}
}
class CircleArray{
private int maxsize; // 表示数组的最大容量
private int front; // 队列头部
private int rear; // 队列尾部
private int[] arr; // 存放数据 模拟队列
//创建构造器
public CircleArray(int arrmaxsize){
this.maxsize=arrmaxsize;
arr=new int[maxsize];
front=-1;//指向队列头部
rear=-1;//指向队列的尾部
}
//判断队列是否为满
public boolean isFull() {
return (rear+1)%maxsize==front;
}
//判断队列是否为空
public boolean isEmpty() {
return rear==front;
}
//添加数据到队列
public void addQueQue(int n) {
//判断队列是否满
if(isFull()) {
System.out.println("队列满,不能加入数据");
return;
}
//将数据加入
arr[rear]=n;
//将rear后移,必须考虑取模
rear=(rear+1)%maxsize;
}
//获取队列的数据,出队列
public int getQueQue() {
//判断是否为空
if(isEmpty()) {
//通过抛出异常
throw new RuntimeException("队列是空数据");
}
//front是指向队列的第一个元素
//1.先把front对应的值保留到一个临时变量
//2.将front后移
//3.将临时保存的变量返回
int value=arr[front];
front=(front+1)%maxsize;
return value;
}
//显示队列的所有数据
public void show() {
//遍历
if(isEmpty()){
System.out.println("队列没有数据");
}
//从front开始遍历,遍历多少个元素
for(int i=front;i<front+size();i++) {
System.out.println("arr["+i%maxsize+"]="+arr[i%maxsize]);
}
}
//求出当前队列有多少个有效数字
public int size(){
return (rear+maxsize-front)%maxsize;
}
//显示队列的头数据,注意不是取出数据
public int headQueQue() {
if(isEmpty()) {
throw new RuntimeException("队列没有数据");
}
return arr[front];
}
}