数组实现环形队列
判断循环队列是否为满的条件
(rear+1)%MaxSize==fornt;
- rear的值最多取到MaxSize-1会浪费一个空间因为你进行存数据时是进行rear会进行移动的,当MaxSize为5时,front为0时此时当rear为4时已经是最大的下标了,因为最大下标数位MaxSize-1
- 此时(rear+1)%MaxSize为0等于front此时就没有空间添加进队列了
- /
/ - 循环队列的思路
- front变量的调整:front指向队列的第一个元素,也就是arr[front]是队列头
- front=0;
- rear变量的调整:rear指向队列的队列的最后一个为值,arr[rear]是对列尾
- rear=0;
- 判断队列满的条件是(rear+1)%MaxSize==front;
- 判断队类空的条件是rear==front;
- 有效的存储数据个数为:(rear+MaxSize-front)%MaxSize//raer=1,front=0;
- */
package 队列.环形队列;
import java.util.Scanner;
/*
判断循环队列是否为满的条件
(rear+1)%MaxSize==fornt;
* rear的值最多取到MaxSize-1会浪费一个空间因为你进行存数据时是进行rear会进行移动的,当MaxSize为5时,front为0时此时当rear为4时已经是最大的下标了,因为最大下标数位MaxSize-1
* 此时(rear+1)%MaxSize为0等于front此时就没有空间添加进队列了
* */
/*
* 循环队列的思路
* front变量的调整:front指向队列的第一个元素,也就是arr[front]是队列头
* front=0;
* rear变量的调整:rear指向队列的队列的最后一个为值,arr[rear]是对列尾
* rear=0;
* 判断队列满的条件是(rear+1)%MaxSize==front;
* 判断队类空的条件是rear==front;
* 有效的存储数据个数为:(rear+MaxSize-front)%MaxSize//raer=1,front=0;
* */
//对数组对列进行修改进行实现
public class Circle_queue {
public static void main(String[] args) {
AyyayCoumn ayyayCoumn=new AyyayCoumn(5);
//创建一个菜单进行提示输入
Scanner scanner = new Scanner(System.in);
Boolean lokp;
lokp = true;
while (lokp) {
System.out.println("输入a,显示对列");
System.out.println("输入b,显示对列头");
System.out.println("输入c,添加数据进对列");
System.out.println("输入d,数据出对列");
char c;
System.out.println("请输入一个字符");
c = scanner.next().charAt(0);//接收第一个字符
switch (c) {
case 'a':
ayyayCoumn.ShowArr();
break;
case 'b':
System.out.println(ayyayCoumn.GetHead());
break;
case 'c':
System.out.println("输入一个数据添加进队列");
int date1 = scanner.nextInt();
ayyayCoumn.AdDate(date1);
break;
case 'd':
System.out.println(ayyayCoumn.GetDate());
break;
default:
System.out.println("输入有误,请输入a,b,c,d中的字符");
}
}
}
//用数组实现对列先的写一个类
public static class AyyayCoumn {
private int MaxSize;//队列的最大的容量
private int front;//队列头
private int rear;//队列尾
private int[] arr;//构建一个数组用来模拟对列
public int getFront() {
return front;
}
public void setFront(int front) {
this.front = front;
}
public int getRear() {
return rear;
}
public void setRear(int rear) {
this.rear = rear;
}
public AyyayCoumn(int Arrmaxsize) {
MaxSize = Arrmaxsize;
arr = new int[MaxSize];
front = 0;//front指向队列的第一个元素,也就是arr[front]是队列头
rear = 0;//rear指向队列的队列的最后一个为值,arr[rear]是对列尾
}
//判断队列是否为满
public Boolean IsFull() {
return (rear+1)%MaxSize==front;
}
//判断队列是否为空
public Boolean IsEmputy() {
return front == rear;
}
//加入数据到队列中
public void AdDate(int date) {
if (IsFull()) {
System.out.println("队列已经满了");
return;
} else
arr[rear] = date;
//德考虑rear会不会重置
rear=(rear+1)%MaxSize;//此时rear已经向下一位了
}
//获取队列的数据,出队列,队列是先进先出;
//判断对列是不是空
public int GetDate() {
if (IsEmputy()) {
//通过抛出异常
throw new RuntimeException("队列为空,数据无法取出");
}
//此时front的值为0现在直接输出0位置就会有值,并且得将front向下一位
//得将arr[front]保存在一个临时变量里然后将front移动后返回临时变量
int temp=arr[front];
front=(front+1)%MaxSize;//front的值也有可能会被重置(取模)
return temp;
}
//显示所有数据
public void ShowArr() {
if (IsEmputy()) {
throw new RuntimeException("队列为空,没有数据");
}
//得从front开始遍历因为front前有可能都是空的并没有值
//从front到front加上这个队列的有效个数
for (int i = front; i <front+(rear+MaxSize-front)%MaxSize ; i++) {
System.out.println("arr[" + i%MaxSize + "]=" + arr[i%MaxSize]);//此时不改下标可能会数组越界,i可能会超过MaxSize
}
}
//获取队列的存储的有效个数
public int ArrSize(){
return (rear+MaxSize-front)%MaxSize;//front头是取数据进行加一rear是加数据进行加一;
//加MaxSize是为了防止rear-front为负
}
//取出队列的头数据
public int GetHead() {
if (IsEmputy()) {
throw new RuntimeException("队列为空,没有数据");
}
return arr[front];
}
}
}
输入a,显示对列
输入b,显示对列头
输入c,添加数据进对列
输入d,数据出对列
请输入一个字符
c
输入一个数据添加进队列
10
输入a,显示对列
输入b,显示对列头
输入c,添加数据进对列
输入d,数据出对列
请输入一个字符
c
输入一个数据添加进队列
20
输入a,显示对列
输入b,显示对列头
输入c,添加数据进对列
输入d,数据出对列
请输入一个字符
c
输入一个数据添加进队列
30
输入a,显示对列
输入b,显示对列头
输入c,添加数据进对列
输入d,数据出对列
请输入一个字符
c
输入一个数据添加进队列
40
输入a,显示对列
输入b,显示对列头
输入c,添加数据进对列
输入d,数据出对列
请输入一个字符
c
输入一个数据添加进队列
50
队列已经满了
输入a,显示对列
输入b,显示对列头
输入c,添加数据进对列
输入d,数据出对列
请输入一个字符
a
arr[0]=10
arr[1]=20
arr[2]=30
arr[3]=40
输入a,显示对列
输入b,显示对列头
输入c,添加数据进对列
输入d,数据出对列
请输入一个字符
d
10
输入a,显示对列
输入b,显示对列头
输入c,添加数据进对列
输入d,数据出对列
请输入一个字符
a
arr[1]=20
arr[2]=30
arr[3]=40
输入a,显示对列
输入b,显示对列头
输入c,添加数据进对列
输入d,数据出对列
请输入一个字符
c
输入一个数据添加进队列
60
输入a,显示对列
输入b,显示对列头
输入c,添加数据进对列
输入d,数据出对列
请输入一个字符
a
arr[1]=20
arr[2]=30
arr[3]=40
arr[4]=60
输入a,显示对列
输入b,显示对列头
输入c,添加数据进对列
输入d,数据出对列
请输入一个字符
d
20
输入a,显示对列
输入b,显示对列头
输入c,添加数据进对列
输入d,数据出对列
请输入一个字符
c
输入一个数据添加进队列
100
输入a,显示对列
输入b,显示对列头
输入c,添加数据进对列
输入d,数据出对列
请输入一个字符
a
arr[2]=30
arr[3]=40
arr[4]=60
arr[0]=100
输入a,显示对列
输入b,显示对列头
输入c,添加数据进对列
输入d,数据出对列
请输入一个字符
b
30
输入a,显示对列
输入b,显示对列头
输入c,添加数据进对列
输入d,数据出对列
请输入一个字符
c
输入一个数据添加进队列
40
队列已经满了
输入a,显示对列
输入b,显示对列头
输入c,添加数据进对列
输入d,数据出对列
请输入一个字符
a
arr[2]=30
arr[3]=40
arr[4]=60
arr[0]=100
输入a,显示对列
输入b,显示对列头
输入c,添加数据进对列
输入d,数据出对列
请输入一个字符
进程已结束,退出代码-1