数组实现环形队列

数组实现环形队列

判断循环队列是否为满的条件
(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值