zoukankan      html  css  js  c++  java
  • Java数组模拟环形队列

    (上一篇队列:https://www.cnblogs.com/yxm2020/p/12676323.html

    1、假溢出

    ​ 系统作为队列用的存储区还没有满,但队列却发生了溢出,我们把这种现象称为"假溢出"。

    因为队列遵从从队尾存入数据,从队头取数据,所以红框部分的空间就不能继续存入新的数据,此时队列有多余的空间,却不能存入值,这种现象就叫做假溢出现象
    

    2、循环队列介绍

    ​ 充分利用了空间,解决“假溢出”的问题

    【循环队列思想】

    ​ 将普通队列想象成逻辑上的首位相连的圆环,把这个叫循环队列,在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满时,也有front=rear。为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件是front=rear,而队列判满的条件是front=(rear+1)%MaxSize

    【为什么要空一个存储单元】

    ​ 我有想过这个问题,rear一直是空的,我为什么不能在里面存值,而我队列判满的条件也是front=(rear+1)%MaxSize,似乎很合情合理,那么我们把目光转到开头,当我存入第一个数字的时候,队尾肯定是要加一的,如果我front,rear的初始值像普通队列那样都为-1,才不会自相矛盾,但是这是个循环队列,当第二轮的时候,这个就不管用了,所以一定要空一个存储单元。

    3、Java代码实现

    1、确定有哪些元素

    • 头尾标志:rear,front,并且初值都为0
    • 最大长度
    • 定义一个数组,这次我决定用泛型(泛型数组,这部分知识很有意思,建议尝试)

    【代码实现】

    public class CircleArrayQueue<T> {
        //最大长度
        private int maxSize;
        //头尾标志
        private int rear;
        private int front;
        T[] array;
        public CircleArrayQueue(int maxSize,Class<T> type){
            init(maxSize,type);
        }
        //初始化
        private void init(int maxSize,Class<T> type){
            //个人觉得这个是个黑盒实现,使用的人传入maxSize大小,你不应该只给他创造maxSize-1的大小
            this.maxSize = maxSize+1;
            rear = 0;
            front = 0;
            array = (T[]) Array.newInstance(type,this.maxSize);
        }
    
        //判断队满
        public boolean isFull(){
            //rear和front的变化一定要记得是个循环,不然很容易搞错,我就搞错好多次
            return (rear+1)%maxSize == front;
        }
        //判断队空
        public boolean isEnpty(){
            return rear == front;
        }
        //插入
        public void add(T t){
            if(isFull()){
                throw new RuntimeException("队列已满");
            }
            array[rear] = t;
            rear = (rear+1)%maxSize;
        }
        //取元素
        public T get(){
            if(isEnpty()){
                throw new RuntimeException("队列为空");
            }
            T t = array[front];
            front = (front+1)%maxSize;
            return t;
        }
        //获得长度
        public int size(){
            return (rear+maxSize-front)%maxSize;
        }
        //打印所有数据
        public void showData(){
            int length = this.size();
            int head = front;
            for (int i = 0; i < length; i++) {
                //先执行array[head],再自加
                System.out.println(array[head]);
                head = (head+1)%maxSize;
            }
        }
    }
    
    

    个人写的代码水平比较低,仅供参考。

  • 相关阅读:
    NBUT 1120 Reimu's Teleport (线段树)
    NBUT 1119 Patchouli's Books (STL应用)
    NBUT 1118 Marisa's Affair (排序统计,水)
    NBUT 1117 Kotiya's Incantation(字符输入处理)
    NBUT 1115 Cirno's Trick (水)
    NBUT 1114 Alice's Puppets(排序统计,水)
    188 Best Time to Buy and Sell Stock IV 买卖股票的最佳时机 IV
    187 Repeated DNA Sequences 重复的DNA序列
    179 Largest Number 把数组排成最大的数
    174 Dungeon Game 地下城游戏
  • 原文地址:https://www.cnblogs.com/yxm2020/p/12753564.html
Copyright © 2011-2022 走看看