数据结构与算法(四)- 用数组模拟环形队列

数据结构与算法(四)- 用数组模拟环形队列

对前面的数组模拟队列的优化,充分利用数组,因此将数组看作是一个环形的。(通过取模的方式来实现)

思路如下:

  1. front变量的含义做一个调整:front就指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素,front的初始值=0
    /**
     * front的变量含义做一个调整:front就指向队列的第一个元素,也就是说arr[front]
     * 初始值 = 0
     */
    private int front;
  1. rear变量的含义做一个调整:rear指向队列的最后一个元素的后一个位置,因为希望空出一个空间做为约定,rear的初始值=0
    /**
     * rear的变量含义做一个调整:rear指向队列的最后一个元素的后一个位置,因为希望空出一个位置做约定
     * 初始值 = 0
     */
    private int rear;
  1. 当队列满时,条件是(rear+1)%maxSize=front(满)
    // 判断队列是否满
    private boolean isFull(){
        
        return (rear + 1) % maxSize == front;
    }
  1. 队列为空时的条件,rear == front 空
    // 判断队列是否为空
    private boolean isEmpty(){

        return rear == front;
    }
  1. 入队
    public void addCirleQueue(int num){
        if (isFull()){
            System.out.println("队列已满");
        }else {
            arr[rear] = num; 
            rear = ( rear + 1 ) % maxSize;// 因为是环形 所以用取模的方法
        }
    }
  1. 出队
    public int getFront(){
        if (isEmpty()){
            System.out.println("队列已空");
            return 0;
        }else {
            int num = arr[front];
            front = (front + 1) % maxSize;
            return num;
        }
    }
  1. 队列中有效的数据个数:(rear+maxSize-front)%maxSize

笔者的粗浅理解

队列与环形队列的区别:

  • front和rear的定义不同:一个初始值都为0,一个初始值都为-1,笔者也思考过是不是起始点都为0可能会比较适合理解,但是却忽略了一点,就是普通队列的操作是先向往后一步,再进行操作,这点是与环形不同的。环形是在进行操作再往后一步,如果都设0为起始,那普通队列的[0]就永远无法被赋值
  • 在环形队列中,要好好理解arr[front]就是队列的第一个元素rear指向队列的最后一个元素的后一个位置
  • 环形队列的精髓在于取模
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值