【数据结构趣味多】循环队列

有时候,不是因为你没有能力,也不是因为你缺少勇气,只是因为你付出的努力还太少,所以,成功便不会走向你。而你所需要做的,就是坚定你的梦想,你的目标,你的未来,然后以不达目的誓不罢休的那股劲,去付出你的努力,成功就会慢慢向你靠近。

导读:本篇文章讲解 【数据结构趣味多】循环队列,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

目录

函数介绍及模拟实现

Front()函数

Rear()函数

enQueue()函数 

deQueue()函数

isEmpty()函数

isFull()函数

循环队列模拟题 


定义:把队列的头尾相连接的的顺序存储结构称为循环队列;循环队列的是由顺序表实现的。

为什么要使用循环队列?

        循环队列是由顺序表实现,也就是数组;我们还知道队列是尾进头出的,如果让数组头出,那么我们需要将后面的元素依次向前挪动,时间复杂度就高了。这是,我们的前辈就想到了循环数组,让数组头尾相连,这样就不用考虑挪动元素了。

【数据结构趣味多】循环队列

函数介绍及模拟实现

  • MyCircularQueue(k): 构造器,设置队列长度为 k 。
  • Front: 从队首获取元素。如果队列为空,返回 -1 。
  • Rear: 获取队尾元素。如果队列为空,返回 -1 。
  • enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
  • deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
  • isEmpty(): 检查循环队列是否为空。
  • isFull(): 检查循环队列是否已满。

Front()函数

 作用:从队首获取元素。

实现原理:先判断队列是否为空,不是空就返回front下标的元素,否则返回-1。

public int Front() {
        if(isEmpty()){
            return -1;
        }
        return elem[front];
    }

Rear()函数

作用:获取队尾元素。

实现原理:因为是循环队列,所以队尾比较难判断。我们分两种情况,因为我们判断循环队列是否满,运用的是牺牲一个空间来判断,因此,当rear的值是0时,正好他在数组开头,我们所需的值就是,数组最后一个下标的值,我们只需让数组长度减一;若不是数组头,我们仅让rear减一即可。

 public int Rear() {
        if(isEmpty()){
            return -1;
        }
        int index=(rear==0)?(elem.length-1):(rear-1);
        return elem[index];
    }

enQueue()函数 

作用:向循环队列插入一个元素。如果成功插入则返回真。

实现原理:判断队列是否满,满的话,就插不了,直接返回false;若不空,将rear下标的数数组值改成value,这里rear不能直接加一,因为rear如果一直加,就会超出数组的长度,导致数组下标越界异常,我们需要对其进行操作,让rear加一,再模上数组长度,就不会超过数组的下标范围了。

public boolean enQueue(int value) {
        if(isFull()){
            return false;
        }
        elem[rear]=value;
        rear=(rear+1)%elem.length;
        return true;
    }

deQueue()函数

作用:从循环队列中删除一个元素。如果成功删除则返回真。

实现原理:enQueue()函数 函数相似

public boolean deQueue() {
        if(isEmpty()){
            return false;
        }
        front=(front+1)%elem.length;
        return true;
    }

isEmpty()函数

作用:检查循环队列是否为空

实现原理:若头尾相等就是空

 public boolean isEmpty() {
        return front==rear;
    }

isFull()函数

作用:检查循环队列是否为满

实现原理:这里体现了对牺牲一个空间来判断是否满;我们让rear向前走一步,如果rear模上数组长度,等于front,那就是满了。

【数据结构趣味多】循环队列

 

 public boolean isFull() {
        if(front==(rear+1)%elem.length) {
            return true;
        }
        return false;
    }

循环队列模拟题 

循环队列例题icon-default.png?t=MBR7https://leetcode.cn/problems/design-circular-queue/description/ 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/150300.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!