使用数组实现循环队列

为了节省空间,这里使用数组实现了更加实用 的循环队列,代码主体和上一篇大多一样,但是涉及到一些细节。

下面是具体的思路:在这里插入图片描述
上一篇中front表示第一个元素前面的位置,rear表示最后一个元素的位置,
但是,在这里由上图可知,front和rear的含义发生了调整。

牺牲一个空间,来提高的代码的可礼节性,这样的循环队列比maxSize上存储一个元素,但是无大碍。

这里面的一个重点就是循环队列的实际有效元素个数:(rear + maxSize - front) % maxSize

在代码书写的过程中出现bug,忘记书写一个return,后面实用debug找到问题所在

下面是源代码:

package Queue;

import java.util.Scanner;

//使用数组实现环形队列,复用前面单向队列
class CircleArrayQueue{
    private int maxSize;//数组的最大容量
    private int front = 0;//指向第一个元素
    private int rear = 0;//指向最后一个元素的后面
    private int[] arr;

    //在构造器中创建数组
    public CircleArrayQueue(int n){
        maxSize = n;
        arr = new int[maxSize];
    }

    //判断是否已满
    public boolean isFull(){
        return (rear + 1) % maxSize == front;
    }

    //判断是否为空
    public boolean isEmpty(){
        return front == rear;
    }

    //进入队列
    public void addQueue(int data){
        if(isFull()){
            System.out.println("队列已满!");
            return;
        }
        arr[rear] = data;
        rear = (rear + 1) % maxSize;
    }

    //取出队列元素
    public int getQueue(){
        if(isEmpty()){
            throw new RuntimeException("队列为空,不能取出!!!");
        }
//        return arr[front++];
        //上面这行代码没有考虑到front也需要取模
        int value = arr[front];
        front = (front+1)%maxSize;
        return value;
    }


    //输出当前队列
    public void show(){
        if(isEmpty()){
            System.out.println("空的");
        }
        for (int i = front; i < front+size() ; i++) {
            System.out.printf("arr[%d] = %d",i%maxSize,arr[i%maxSize]);
            System.out.println();
        }
    }

    //求出当前队列有效数字个数
    public int size(){
        return (rear + maxSize - front) % maxSize;
    }

    //输出当前头部元素
    public int head(){
        if(isEmpty()){
            System.out.println("空的");
        }
        return arr[front];
    }

}
public class CircleArrayQueueDemo {
    public static void main(String[] args) {
        //菜单
        CircleArrayQueue queue = new CircleArrayQueue(5);
        char key = ' ';
        Scanner scanner = 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(head)代表获取头部元素");
            System.out.println("e(exit)代表退出程序");
            System.out.println("请输入进行的操作:");
            key = scanner.next().charAt(0);//接受一个字符
            switch ( key ){
                case 's':
                    queue.show();
                    break;
                case 'a':
                    System.out.println("请输入添加de的数字:");
                    int item = scanner.nextInt();
                    queue.addQueue(item);
                    break;
                case 'g':
                    try {
                        int res = queue.getQueue();
                        System.out.println("取出的数字为"+res);
                    }catch (Exception e){
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'h':
                    int res2 = queue.head();
                    System.out.println("当前的头部元素为"+res2);
                    break;
                case 'e':
                    loop = false;
                    System.out.println("程序退出~~~");
                    return;
                default:
                    break;

            }
        }
    }
}

在这里插入图片描述
由程序运行截图可知,数组始终是要空出一个位置

参与评论 您还未登录,请先 登录 后发表或查看评论
相关推荐

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

皮带秀柚揪

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值