数据结构——队列,循环队列

本文详细介绍了如何使用数组实现循环队列,包括队列的构造、判断队列是否满或空、添加和获取数据等核心操作。通过优化,实现了循环队列的功能,提高了空间利用率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.使用数组模拟队列
在这里插入图片描述

//使用数组模拟队列
class ArrayQueueDemo{
    private  int maxSize;
    private  int front;
    private  int rear;
    private  int[] arr ;

    //队列的构造函数
    public ArrayQueueDemo(int maxSize) {
        this.maxSize = maxSize;
        arr = new int[maxSize];
        front = -1;  //指向队列头部,fount指向队列头的前一个位置
        rear = -1;  //指向队列尾部,指向队列为的数据(就是队列的最后一个数据)
    }

    //判断队列是否满
    public boolean full(){
        if(rear == maxSize-1) {
            System.out.println("队列已满!");
            return false;   //队列已满
        }
        return true;

    }

    //判断队列是否为空
    public boolean empty(){
        if(front==rear){
            throw new RuntimeException("队列为空");
        }
        return true;
    }

    //添加数据到队列,入队列
    public void  addQueue(int value){
        if(full()){
            rear++;
            arr[rear] = value;
        }
    }

    //获取队列的数据,出队列——》队列为空抛异常
    public void getQueue(){
        if(empty()){
            front++;
            System.out.println("取出的数据为:"+arr[front]);
        }
    }

    //显示队列的所有数据
    public void show(){
        if(empty()) {
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + "\t");
            }
            System.out.println();
        }
    }

    //显示队列的头部
    public int headShow(){
        if(empty()){
            System.out.println("队列头为:"+arr[front+1]);
            return arr[front+1];
        }else {
            throw new  RuntimeException("头部为空");
        }
    }


}

但是这样只能使用一次,没有起到循环队列的作用。接下来对这组代码进行优化。

首先考虑队列的特性:先进先出,改变之前的部分条件

/**
 * 思路:
 * 1.front 变量改为指向队列的第一个元素,arr【0】,front初始值为0
 * 2.rear 变量改为指向队列的最后一个元素的后一个位置,arr【length】,rear初始值为0
 * 3.将rear的后一个元素位置空下,做为一个空出一个空间的约定
 * 4.队列满的条件:(rear+1)% maxSize == front
 * 5.队列为空的条件: rear == front
 * 6.队列中的有效数据的个数为 (rear + maxSize -front)%maxSize。
 */

在这里插入图片描述

//使用数组模拟循环队列
class CycleQueueDemo{
    private  int maxSize;
    private  int front;
    private  int rear;
    private  int[] arr ;

    //队列的构造函数
    public CycleQueueDemo(int maxSize) {
        this.maxSize = maxSize;
        arr = new int[maxSize];
        front = 0;  //指向队列头部,fount指向队列头的前一个位置
        rear = 0;  //指向队列尾部,指向队列为的数据(就是队列的最后一个数据)
    }

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

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

    //添加数据到队列,入队列
    public void  addQueue(int value){
        if(full()){
           throw new RuntimeException("队列已满!");
        }
        arr[rear] = value;
        rear=(rear+1)%maxSize;   //考虑取模
    }

    //获取队列的数据,出队列——》队列为空抛异常
    public int getQueue(){
        if(empty()){
            throw new RuntimeException("队列为空!");
        }
        //将front对应的值保存到一个临时变量中,为了使front后移,否则返回的值不一样
        int value = arr[front];
        front = (front + 1) % maxSize;
        return value;
    }

    //显示队列的所有数据
    public void show(){
        if(empty()) {
            System.out.println("队列为空");
            return;
        }

        //思路:从front开始遍历,遍历多少个元素
        for (int i = front; i < front + size(); i++) {
            System.out.print(arr[i % maxSize]+"\t");
        }
        System.out.println();
    }

    //求出当前队列的有效个数
    public int size(){
        return (rear + maxSize - front) % maxSize;   //所有求模的小算法
    }

    //显示队列的头部
    public int headShow(){
        if(empty()){
            throw new  RuntimeException("头部为空");
        }else {
            System.out.println("队列头为:"+arr[front]);
            return arr[front];
        }
    }

}

测试用例:

public static void main(String[] args) {
        CycleQueueDemo queue = new CycleQueueDemo(5);   //实际队列最多可以使用3个
        char a = ' ';
        Scanner scanner = new Scanner(System.in);
        boolean loop = true;
        while (loop){
            System.out.println("1.输入s(show)显示队列数据");
            System.out.println("1.输入a(add)添加数据");
            System.out.println("1.输入g(get)取出队列数据");
            System.out.println("1.输入h(headQueue)显示队列头部");
            System.out.println("1.输入e(exit)退出");
            System.out.println("===================================");
            a = scanner.next().charAt(0);
            switch (a){
                case 's':
                        queue.show();
                    break;
                case 'h':
                    try {
                        queue.headShow();
                    }catch (Exception e){
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'a':
                    try {
                        System.out.println("输入添加的值:");
                        int value = scanner.nextInt();
                        queue.addQueue(value);
                    }catch (Exception e){
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'g':
                    try {
                        System.out.println("取出的值为:"+queue.getQueue());
                    }catch (Exception e){
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'e':
                    scanner.close();
                    loop = false;

                    break;
            }
        }
        System.out.println("已退出");
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值