环形队列是循环队列吗对吗(环形队列是什么)

环形队列是循环队列吗对吗(环形队列是什么)使用数组模拟环形队列的思路分析 思路如下 1 front 变量的定义做一个调整 front 指向队列的第一个元素 也就是说 arr front 就是队列的第一个元素 front 的初始值为 0 2 rear 变量的含义做一个调整 rear 指向队列的的最后一个元素的后一个位置 因为希望空出一个空间作为约定 rear 的初始值为 0 3 当队列满时 条件是 rear 1 maxSize

大家好,我是讯享网,很高兴认识大家。



/使用数组模拟环形队列的思路分析

思路如下:

1.front变量的定义做一个调整:front指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素

    front的初始值为0

2.rear变量的含义做一个调整:rear指向队列的的最后一个元素的后一个位置,因为希望空出一个空间作为约定

    rear的初始值为0

3.当队列满时,条件是 (rear + 1) % maxSize == front

4.队列为空的条件是 rear = front

5.当我们这样分析,队列中有效的数据的个数(rear + maxSize- front)%maxSize

/

import java.util.Scanner;

public class circle_array {

    public static void main(String[] args) {

        circlearray arrque = new circlearray(4);//创建一个环形队列,这里设置4,其队列的有效数据最大为3

        char key = ' ';//接收用户输入

        Scanner scanner = new Scanner(System.in);//

        boolean loop = true;

        while(loop){

            System.out.println("s(show):显示队列");

            System.out.println("e(exit):退出程序");

            System.out.println("a(add):添加数据到队列");

            System.out.println("g(get):从队列里取数据");

            System.out.println("h(head):查看队列头数据");

            key = scanner.next().charAt(0);

            switch (key) {

                case 's':

                    arrque.showQueue();

                    break;

                case 'a':

                    System.out.println("输出一个数");

                    int value = scanner.nextInt();

                    arrque.addQueue(value);

                    break;

                case 'g': // 取出数据

                    try {

                        int res = arrque.getQueue();

                        System.out.printf("取出的数据是%d ", res);

                    } catch (Exception e) {

                        //TODO: handle exception

                        System.out.println(e.getMessage());

                    }

                    break;

                case 'h'://查看队列头数据

                    try {

                        int res = arrque.headQueue();

                        System.out.printf("队列头数据是%d ", res);

                    } catch (Exception e) {

                        //TODO: handle exception

                        System.out.println(e.getMessage());

                    }

                    break;

                case 'e'://退出程序

                    scanner.close();

                    loop = false;

                    break;

                default:

                    break;

            }

        }

        System.out.println("程序退出");

    }

}

class circlearray{

    private int maxSize; //表示数组的最大容量

    private int front; //指向队列头

    private int rear; //指向队列尾


讯享网

    private int[] arr; //该数组用于存放数据,模拟队列

    //创建队列的构造器

    public circlearray(int ArrMaxSize){

        maxSize = ArrMaxSize;

        arr = new int [maxSize];

        front = 0;

        rear = 0;

    }

    //判断队列是否为满

    public boolean isFull(){

        return (rear + 1) % maxSize == front;

    }

    //判断队列是否为空

    public boolean isEmpty(){

        return front == rear;

    }

    //添加数据到队列

    public void addQueue(int n){

        //判断队列是否满

        if(isFull()){

            System.out.println("队列满,不能加入数据");

            return;

        }

        arr[rear] = n;

        rear= (rear+1)%maxSize;//rear后移,必须考虑取模

    }

    //获取队列的数据,出队列

    public int getQueue(){

        //判断队列是否空

        if(isEmpty()){

            //通过抛出异常

            throw new RuntimeException("队列空,不能取数据");

        }

        //这里需要分析出front是指向队列的第一个元素

        //1.先把front对应的值保存到一个临时变量2.将front后移3.将临时保存的变量返回

        int value = arr[front];

        front = (front+1)%maxSize;//front后移

        return value;

    }  

     //显示队列的所有数据

     public void showQueue(){

        if(isEmpty()){

            System.out.println("队列空,没有数据");

            return;

        }

        //从front开始遍历

        for(int i = front;i<front+size();i++){

            System.out.printf("arr[%d]=%d ", i%maxSize , arr[i%maxSize]);

        }

    }

   

    //求出当前队列有效数据的个数

    public int size(){

        return (rear + maxSize - front) % maxSize;

    }

    //显示队列的头数据,注意不是取出数据

    public int headQueue(){

        //判断队列是否空

        if(isEmpty()){

            throw new RuntimeException("队列空,没有数据~~");

        }

        return arr[front];

    }

}

小讯
上一篇 2025-06-17 09:09
下一篇 2025-06-03 20:09

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/164235.html