2026/4/18 10:11:35
网站建设
项目流程
微信怎样建网站,国际网站开发客户的技巧,做视频网站需要哪些技术指标,小广告清理数据结构#xff1a;队列#xff08;Queue#xff09; —— 后端开发中最常用、最容易被忽略的“先进先出”神器
队列是数据结构中最简单却又极其重要的线性结构之一#xff0c;它的核心特性只有一句话#xff1a;
先进先出#xff08;FIFO - First In First Out#…数据结构队列Queue—— 后端开发中最常用、最容易被忽略的“先进先出”神器队列是数据结构中最简单却又极其重要的线性结构之一它的核心特性只有一句话先进先出FIFO - First In First Out就像排队买奶茶先来的先拿到先排队的人先走。1. 队列的核心操作必须掌握的 5 个操作英文名称时间复杂度说明入队enqueue / offerO(1)从队尾添加元素出队dequeue / pollO(1)从队首移除并返回元素查看队首peek / frontO(1)只看队首元素不移除判断空isEmptyO(1)判断队列是否为空获取长度sizeO(1)返回当前队列中的元素个数注意好的队列实现中上面所有操作都应该是 O(1) 的。2. 队列的几种常见实现方式对比2025-2026面试最常问实现方式底层结构入队复杂度出队复杂度特点与适用场景推荐指数顺序队列数组固定大小数组O(1)O(n)简单但出队效率低需前移元素★★☆☆☆循环队列数组固定/动态数组头尾指针O(1)O(1)最高效空间利用率高最推荐★★★★★链表队列单向链表O(1)O(1)空间动态扩展无上限内存不连续★★★★☆双端队列Deque双向链表/数组O(1)O(1)头尾都可进出Java LinkedList/ArrayDeque★★★★☆优先队列PriorityQueue堆二叉堆O(log n)O(log n)不是严格的FIFO按优先级出队★★★☆☆结论日常开发中 90% 的队列需求用循环队列数组实现或链表队列就够了。性能要求极高或需要动态扩容 → 优先用循环队列带动态扩容。3. 最经典的循环队列实现Java版面试常考publicclassCircularQueue{privateint[]data;privateintfront;// 指向队首元素privateintrear;// 指向队尾下一个空位privateintsize;// 当前元素个数privateintcapacity;publicCircularQueue(intk){capacityk;datanewint[k];front0;rear0;size0;}publicbooleanenQueue(intvalue){if(isFull()){returnfalse;}data[rear]value;rear(rear1)%capacity;size;returntrue;}publicbooleandeQueue(){if(isEmpty()){returnfalse;}front(front1)%capacity;size--;returntrue;}publicintFront(){if(isEmpty())return-1;returndata[front];}publicintRear(){if(isEmpty())return-1;returndata[(rear-1capacity)%capacity];}publicbooleanisEmpty(){returnsize0;}publicbooleanisFull(){returnsizecapacity;}}关键点记忆口诀“rear 永远指向下一个空位”“满的判断size capacity”“空的判断size 0”“取尾元素(rear-1 capacity) % capacity”4. 队列的经典应用场景后端最常遇到场景队列作用典型技术选型消息队列异步解耦、削峰填谷RabbitMQ / Kafka / Redis List任务队列定时任务、延时任务、异步处理DelayQueue / Redis ZSETBFS广度优先搜索层序遍历、求最短路径LinkedList 作为队列滑动窗口最大值维护窗口内最大值双端队列Deque生产者-消费者模型线程间通信BlockingQueueArrayBlockingQueue请求缓冲池高并发场景限流、缓冲请求LinkedBlockingQueue打印机任务队列先来先服务顺序队列5.后端面试最常考的队列相关问题建议全部手写用两个栈实现队列经典用队列实现栈相对少见滑动窗口最大值双端队列最近请求次数队列 时间戳设计循环队列LeetCode 622设计双端队列LeetCode 6416. 一句话总结背下来就赢了“队列的核心就是先进先出核心难点在于循环数组的边界处理和判空判满条件”后端真正常用的队列普通队列 → LinkedList / ArrayDeque阻塞队列 → LinkedBlockingQueue / ArrayBlockingQueue优先队列 → PriorityQueue延迟队列 → DelayQueue / Redis ZSET你现在对队列最想搞清楚的是哪个部分是循环队列的边界判断双端队列的实现还是实际项目中怎么选队列告诉我我可以给你更针对性的代码或案例