news 2026/8/11 5:11:09

美团一面:循环队列听说过么,怎么实现?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
美团一面:循环队列听说过么,怎么实现?

👉这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:

  • 《项目实战(视频)》:从书中学,往事上“练”

  • 《互联网高频面试题》:面朝简历学习,春暖花开

  • 《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题

  • 《精进 Java 学习指南》:系统学习,互联网主流技术栈

  • 《必读 Java 源码专栏》:知其然,知其所以然

👉这是一个或许对你有用的开源项目

国产Star破10w的开源项目,前端包括管理后台、微信小程序,后端支持单体、微服务架构

RBAC权限、数据权限、SaaS多租户、商城、支付、工作流、大屏报表、ERP、CRMAI大模型、IoT物联网等功能:

  • 多模块:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • 微服务:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK17/21+SpringBoot3、JDK8/11+Spring Boot2双版本

来源:飞天小牛肉

  • 顺序队列

    • 顺序队列定义

    • 假溢出问题

  • 循环队列


顺序队列

顺序队列定义

队列的底层是数组,我们常说的队列其实就是顺序队列,其数据结构定义一般是:

  1. 队头指针指向数组第一个元素

  2. 队尾指针指向数组最后一个元素的下一个位置

为了避免当只有一个元素时,队头和队尾重合使处理变得麻烦,所以这里引入了队头和队尾两个指针,假设front指针指向队头元素,rear指针指向队尾元素的下一个位置,这样:

  • front == rear时,表示这个队列是空队列

  • front == rear + 1时,表示这个队列中只有一个元素

示意图如下:

众所周知,队列是先进先出的,那么进队操作对应的步骤就是:先送值到队尾,再将队尾指针 +1

// 送值到队尾 queue[rear] = x; // 队尾指针 +1 rear ++;

出队操作:先取出队头元素,再将队头指针 +1

// 取出队头元素 x = queue[Q.front] // 队头指针 +1 front ++;

假溢出问题

顺序队列存在假溢出问题 ,就是明明在队列中仍然有可以存放元素的空间却无法执行入队操作了,举个例子:

队列的大小是 5(数组容量为 5),一开始是空队列,然后依次入队了 A、B、C、D:

然后 A 出队,B 出队,相应的 front 指针会往后移动两位:

再入队一个新元素 E,此时 front 指针不变,rear 指针需要 +1,已经超出了数组的下标范围,就会导致新元素插入失败:

明明队列中还有空间,插入元素竟然会失败?这就是一种假性上溢出现象。

如何解决这个问题呢,有三种:

  1. 建立一个足够大的存储空间以避免溢出。这样做空间使用率低,浪费存储空间

  2. 移动元素:每当出队一个元素,就将移动队列中所有的已有元素向队头移动一个位置。这样做很明显时间复杂度比较高,效率慢

  3. 循环队列:将队头和队尾看作是一个首尾相接的循环队列

因此,循环队列是解决顺序队列假溢出问题的最佳选择!

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

循环队列

循环队列的数据结构定义一般是:

  1. 队列长度固定,即队列(数组)容量有限

  2. 队列的头尾相接形成一个环,当队尾到达数组的最后一个位置时,下一个位置是数组的第一个位置

具体实现步骤如下:

  1. 定义一个数组和两个指针:frontrear,分别表示队头和队尾的位置。初始时(空队列),队头和队尾都指向数组的第一个位置,即front = rear = 0

  2. 入队时,首先检查队列是否已满,如何判断队列满?牺牲一个单元来区分队空和队满:即(rear + 1) % maxsize = front。如果满了则返回错误,否则将元素添加到队尾,即queue[rear] = element,然后将 rear 指针向后移动一位,即rear = (rear + 1) % capacity

  3. 出队时,首先检查队列是否为空,**front == rear就表示队列空** 。如果为空则返回错误,否则将队头元素取出并返回,即element = queue[front],然后将front指针向后移动一位,即front = (front + 1) % capacity

  4. 在队列的任何时刻,队列中的元素数量为(rear - front + capacity) % capacity

示意图如下:

以下是一个基于数组实现循环队列的 Java 代码示例:

public class CircularQueue { // 存储元素的数组 privateint[] data; privateint front, rear; // 数组大小 privateint capacity; public CircularQueue(int k) { capacity = k; data = newint[capacity]; front = 0; rear = 0; } // 入队 public boolean enqueue(int element) { if (isFull()) { returnfalse; } else { data[rear] = element; rear = (rear + 1) % capacity; returntrue; } } // 出队 public boolean dequeue() { if (isEmpty()) { returnfalse; } else { front = (front + 1) % capacity; returntrue; } } // 获取队头元素 public int front() { if (isEmpty()) { return -1; } else { return data[front]; } } // 获取队尾元素 public int rear() { if (isEmpty()) { return -1; } else { return data[(rear - 1 + capacity) % capacity]; } } // 判断队列是否为空 public boolean isEmpty() { return front == rear; } // 判断队列是否满 public boolean isFull() { return (rear + 1) % capacity == front; } }

简单总结就是:

  • 初始/队空:front = rear

  • 出队:front = (front + 1) % capacity (最大元素个数)

  • 进队:rear = (rear + 1) % capacity

  • 队列长度:(rear - front + capacity) % capacity

  • 队满(牺牲一个单元来区分队空和队满 ):(rear + 1) % capacity = front


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。 谢谢支持哟 (*^__^*)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/11 5:09:55

2026年人生仓库企业发展前景几何?从行业现状看未来潜力

家人们,今天咱们来聊聊河北人生仓库文化传媒有限公司(简称人生仓库)在2026年的发展前景。在如今竞争激烈的市场环境里,很多企业和创业者都面临着品牌声量弱、营销成本高、获客难等问题。人生仓库能从中突围并展现出怎样的潜力呢&a…

作者头像 李华
网站建设 2026/7/14 15:37:39

Ardupilot 直升机自动油门控制:从参数配置到故障诊断

1. 直升机自动油门控制基础原理 直升机主旋翼的转速控制直接影响飞行稳定性。传统油门曲线控制需要飞行员手动调整油门输出,而自动油门模式则通过飞控系统自动维持设定转速。这种控制方式特别适合负载变化频繁的场景,比如吊挂作业或突发机动时。 自动油门…

作者头像 李华
网站建设 2026/8/11 5:10:34

零前端经验如何用Cursor开发Vue3项目?SpringBoot点餐系统踩坑实录

零前端经验如何用Cursor高效开发Vue3SpringBoot全栈项目 作为一名长期深耕后端开发的工程师,我深知前端技术栈的复杂性常常让后端开发者望而却步。直到遇见了Cursor这款AI编程助手,它彻底改变了我对全栈开发的认知。本文将分享我如何从零前端经验出发&am…

作者头像 李华
网站建设 2026/8/11 5:09:31

揭秘Docker 27内核级安全增强:seccomp-bpf v2、rootless mode 2.0与gVisor深度集成如何重构金融容器可信边界

第一章:Docker 27金融容器安全演进全景图金融行业对容器化平台的安全性要求极为严苛,Docker 27版本在金融级合规、运行时防护与供应链可信方面实现了系统性升级。其安全能力不再局限于镜像扫描或网络隔离,而是构建了从开发、构建、分发到生产…

作者头像 李华
网站建设 2026/7/14 15:37:39

阿里云弹性裸金属|物理隔离极致性能

阿里云弹性裸金属服务器概述阿里云弹性裸金属服务器(EBM)是一种兼具物理机性能与云服务器弹性的计算服务。它采用物理隔离设计,确保用户独占计算资源,避免虚拟化开销,适合高性能计算、核心数据库、金融交易等场景。EBM…

作者头像 李华