环形队列(java)
思路
环形队列需要使用到取余%
1:判断队列是否已经满了(rear+1) % maxSize == front;,给队尾加一取余如果和指向对头的front一样就表示队列已经满了
2:判断队列是否为空 rear == front;,当队尾和对头相等时,队列就为空
3:队尾,rear = (rear+1)%maxSize;队尾向后移动,同时取余队列大小,不让队尾超出范围,实现环形;
4:队列的有效个数(rear + maxSize - front)%maxSize;因为队列中留出了一格不会存放数据,所以rear+maxSize相加不会出现(rear + maxSize - front)%maxSize==0的情况,同时(rear + maxSize - front)确保了不会为负数,%确保了始终是环形
****代码
`
public class A02_ArrayQueue {
public static void main(String[] args) {
ArrayQueue queue = new ArrayQueue(8);
Scanner sc = new Scanner(System.in);
char key = ''
boolean isFlag = true;
while (isFlag) {
System.out.println("s(show):显示队列");
System.out.println("a(add):添加数据");
System.out.println("g(get):取出数据");
System.out.println("h(head):查看队列头数据");
System.out.println("e(exit):退出队列");
System.out.println("请输入选择(s/a/g/h/c):");
key = sc.next().charAt(0);
switch (key) {
case 's':
queue.showQueue();
break;
case 'a':
if (queue.isFull()) {
System.out.println("队列满了,请重新选择~~");
break;
}
System.out.println("请输入要添加的数字:");
int n = sc.nextInt();
queue.addQueue(n);
break;
case 'g':
if (queue.isEmpty()) {
System.out.println("队列空了,请重新选择~~");
break;
}
queue.getQueue();
case 'h':
queue.headQueue();
break;
case 'e':
sc.close();
isFlag = false;
break;
default:
break;
}
}
System.out.println("程序退出~~~");
}
class ArrayQueue{
private int maxSize; //数组最大容量
private int front; //队列头
private int rear; //队列尾
private int[] arr; //存放数据
//初始化队列
public ArrayQueue(int maxSize){
this.maxSize = maxSize;
arr = new int[this.maxSize];
}
//判断队列是否已经满了
public boolean isFull(){
//判断队列的尾部后移一个位置如果等于队列头就表示队列满了
return (rear+1) % maxSize == front;
}
//判断队列是否为空
public boolean isEmpty(){
return rear == front;
}
//向队列添加数据
public void addQueue(int n){
if(isFull()){
System.out.println("队列已满");
return;
}
arr[rear] = n;
rear = (rear+1)%maxSize;
}
//取出队列头部
public int getQueue() {
if(isEmpty()){
System.out.println("队列为空");
try {
throw new Exception("队列为空");
} catch (Exception e) {
e.printStackTrace();
}
}
int value = arr[front];
front = (front+1)%maxSize;
return value;
}
//返回队列中的有效个数
public int size(){
return (rear + maxSize - front)%maxSize;
}
public void showQueue(){
if(isEmpty()){
System.out.println("队列为空");
return;
}
for(int i = front;i
}
`
https://blog.csdn.net/wangjiaju960914/article/details/119959066