环形队列

数组模拟环形队列

前面的数组我们使用一次以后就不可以接着使用啦,为了接着使用前面取出的空间,利用循环数组实现。循环数组的实现要给尾指针留出一个位置用来判断是否和第一个指针相等。相等的条件用取模的方法实现(rear+1)%maxsize=first

分析思路

  1. 头指针first做调整,first直接指向第一个元素。first=0;
  2. 尾指针rear做调整,rear需要预留一个空间用来判断队列是否为满,rear=0;
  3. 判断队列是否为空,first=rear;判断队列是否未满,(rear+1)%maxsize=first;
  4. 队列中有效数据个数为:(rear+maxsize-first)%maxsize;
package 队列;

import java.util.Scanner;

public class 数组模拟环形队列 {
    public static void main(String[] args){
        //创建队列
        Q Q = new Q(4);
        char key = ' ';//用于接收用户输入
        Scanner sc = new Scanner(System.in);
        boolean loop = true;
        //输出一个菜单
        while (loop) {
            System.out.println("s:显示队列");
            System.out.println("e:退出程序");
            System.out.println("a:添加数据");
            System.out.println("g:取去数据");
            System.out.println("h:查看头数据");

            key = sc.next().charAt(0);//接受键盘的字符

            switch (key) {
                case 's':
                    Q.show();
                    break;
                case 'a':
                    System.out.println("请输入一个数");
                    int value = sc.nextInt();
                    Q.add(value);
                    break;
                case 'g':
                    try {
                        int res = Q.out();
                        System.out.println("取出的数据是:" + res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'h':
                    try {
                        int res = Q.head();
                        System.out.println("头数据为:" + res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;

                case 'e':
                    sc.close();
                    loop = false;
                    break;

                default:
                    break;

            }

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


class Q{
    //定义队列成员变量
    public int Maxsize;
    public int first;
    public int rear;
    public int[] arr;

    //定义构造方法
    public  Q() {
    }

    public Q(int maxsize) {
        Maxsize = maxsize;
        arr = new int[Maxsize];
        first = 0;//指向队列的第一个元素
        rear =0;//预留出一个位置,判断是否为满,取模后和头指针相等
    }

    //成员方法
    //判断队列是否为空
    public boolean isempty() {
        return first == rear;
    }

    //判断队列是否为满
    public boolean isfull() {
        return (rear+1)%Maxsize == first;
    }

    //向队列中添加数据
    public void add(int n){
        //判断队列是否未满,若满则不能添加数据
        if(isfull()){
            System.out.println("队列满,无法添加");
            return;
        }
        arr[rear]=n;
        rear=(rear+1)%Maxsize;//必须考虑取模
    }
    //获取队列数据;出队列
    public int out(){
        //判断队列是否为空,若为空,则抛出异常
        if(isempty()){
            throw new RuntimeException("队列空,不可以出列");
        }
        int res=arr[first];
        first=(first+1)%Maxsize;
        return res;
    }

    //显示队列所有数据
    public void show(){
        if(isempty()){
            System.out.println("队列为空");
            return;//这个地方的return一定不要丢
        }
        //从first开始遍历,遍历多少个元素
        for(int i=first;i<first+(rear+Maxsize-first)%Maxsize;i++){
            System.out.println(arr[i]);
        }
    }


    //显示队列头数据
    public int head(){
        if (isempty()){
            throw new RuntimeException("队列空,无数据");
        }
        return arr[first];
    }
}

参考资料:尚硅谷-数据结构与算法

posted @ 2020-12-29 17:19  胡木杨  阅读(245)  评论(0)    收藏  举报