当前位置: 首页 > news >正文

数据结构(二)队列和栈

目录

1 基本API

2 实现栈(用标准库的链表)

3 实现队列(用标准库的链表)

4 实现栈(用标准库的数组)

5 实现队列(用之前实现的环形数组)

6 双端队列


队列(先进先出FIFO)和栈(后进先出LIFO)的原理非常简单,它们底层实现就是数组或链表,只不过仅仅提供在头尾操作元素的 API,所以我们常说它们是操作受限的数据结构。

队列只能在「队尾(Rear)」插入元素,「队头(Front)」删除元素;

栈只能在「栈顶(Top)」插入和删除元素。

1 基本API

// 队列的基本 API class MyQueue<E> { // 向队尾插入元素,时间复杂度 O(1) void push(E e); // 从队头删除元素,时间复杂度 O(1) E pop(); // 查看队头元素,时间复杂度 O(1) E peek(); // 返回队列中的元素个数,时间复杂度 O(1) int size(); }
// 栈的基本 API class MyStack<E> { // 向栈顶插入元素,时间复杂度 O(1) void push(E e); // 从栈顶删除元素,时间复杂度 O(1) E pop(); // 查看栈顶元素,时间复杂度 O(1) E peek(); // 返回栈中的元素个数,时间复杂度 O(1) int size(); }

2 实现栈(用标准库的链表)

把双链表的尾部作为栈顶,在双链表尾部增删元素的时间复杂度都是 O(1),符合要求。

package Theoretical_foundation.stack; import java.util.LinkedList; public class MyLinkedStack<E> { //stack 是栈的底层容器,从创建栈开始,stack 就固定指向这个链表,全程不会、也不能换其他容器 //很多人会误以为[加了final,stack 就不能 push、pop 了] —— 这是完全错误的! //final 只限制「list 引用不能变」,不限制「list 内部的元素操作」 private final LinkedList<E> stack = new LinkedList<>(); public void push(E e) { stack.addLast(e); } public E pop() { return stack.removeLast(); } public E peek() { return stack.getLast(); } public int size() { return stack.size(); } public static void main(String[] args) { MyLinkedStack<Integer> stack = new MyLinkedStack<>(); stack.push(1); stack.push(2); stack.push(3); System.out.println(stack.peek()); // 3 System.out.println(stack.pop()); // 3 System.out.println(stack.peek()); // 2 } }

3 实现队列(用标准库的链表)

把双链表的尾部作为队尾,把双链表的头部作为队头,在双链表的头删、尾增元素的复杂度都是 O(1),符合队列 API 的要求。

package Theoretical_foundation.queue; import java.util.LinkedList; public class MyLinkedQueue<E> { private final LinkedList<E> queue = new LinkedList<>(); public void push(E e) { queue.addLast(e); } public E pop() { return queue.removeFirst(); } public E peek() { return queue.getFirst(); } public int size() { return queue.size(); } public static void main(String[] args) { MyLinkedQueue<Integer> queue = new MyLinkedQueue<>(); queue.push(1); queue.push(2); queue.push(3); System.out.println(queue.peek()); // 1 System.out.println(queue.pop()); // 1 System.out.println(queue.pop()); // 2 System.out.println(queue.peek()); // 3 } }

4 实现栈(用标准库的数组)

数组尾部增删元素的时间复杂度都是 O(1),符合栈的要求。

package Theoretical_foundation.stack; import java.util.ArrayList; public class MyArrayStack<E> { private ArrayList<E> stack = new ArrayList<>(); public void push(E e) { stack.add(e); } public E pop() { return stack.remove(stack.size() - 1); } public E peek() { return stack.get(stack.size() - 1); } public int size() { return stack.size(); } public static void main(String[] args) { MyArrayStack<Integer> stack = new MyArrayStack<>(); stack.push(1); stack.push(2); stack.push(3); System.out.println(stack.peek()); // 3 System.out.println(stack.pop()); // 3 System.out.println(stack.peek()); // 2 } }

5 实现队列(用之前实现的环形数组)

有了前文环形数组中实现的类CycleArray,用CycleArray作为底层数据结构实现队列就不难了,在CycleArray的头删、尾增元素的复杂度都是 O(1),符合队列 API 的要求。

package Theoretical_foundation.queue; import Theoretical_foundation.array.CycleArray; public class MyCycleArrayQueue<E> { private CycleArray<E> queue = new CycleArray<>(); public void push(E e) { queue.addLast(e); } public void pop() { queue.removeFirst(); } public E peek() { return queue.getFirst(); } public int size() { return queue.size(); } public static void main(String[] args) { MyLinkedQueue<Integer> queue = new MyLinkedQueue<>(); queue.push(1); queue.push(2); queue.push(3); System.out.println(queue.peek()); // 1 System.out.println(queue.pop()); // 1 System.out.println(queue.pop()); // 2 System.out.println(queue.peek()); // 3 } }

6 双端队列

标准队列只能在队尾插入元素,队头删除元素,而双端队列的队头和队尾都可以插入或删除元素。

可以用链表、循环数组实现。

http://www.jsqmd.com/news/461690/

相关文章:

  • 打开网站显示“未检测到您服务器环境的sqlite3数据库扩展…”错误怎么办|已解决
  • 2026年聚氨酯灌封胶厂家深度选型指南:不同需求下的匹配方案 - 速递信息
  • 支付宝红包套装回收避坑指南:3 个套路要避开,正确回收姿势看这里 - 团团收购物卡回收
  • PBOOTCMS网站程序提示“执行SQL发生错误!错误:DISK I/O ERROR”
  • 系统认识栈和队列
  • 2026年江苏盐城最新原料药/医药中间体/橡胶助剂供应商权威推荐榜:高品质原料药/医药中间体/橡胶助剂供应商推荐,助力制药与化工企业降本增效 - 速递信息
  • 高并发分布式系统
  • 和信通礼品卡回收哪家快?2026年畅回收3分钟审核,91折到账 - 畅回收小程序
  • App Store软件上架流程,把打包、签名和上传拆开执行,AppUploader(开心上架)/Xcode
  • 2026年评价高的秘制熏鸡公司推荐:玉田正宗熏鸡/玉田正宗玉江熏鸡厂家综合实力对比 - 品牌宣传支持者
  • 基于微信的美食推荐小程序[小程序]-计算机毕业设计源码+LW文档
  • 【量化工具推荐】期货量化交易风险管理模块对比:8款平台深度分析
  • 2026全新升级青岛TOP1:全自动工业滤水器选华博机械 - 速递信息
  • 2026 年发表论文秘籍:前 5 大关键步骤你掌握了吗?
  • 【IEEE出版 | EI检索】第七届机电一体化技术与智能制造国际学术会议(ICMTIM 2026)
  • lora和lorawan概念
  • 2026年 实验室/手术室净化工程公司推荐榜:洁净空间建设与装修技术实力深度解析,专业无尘车间/净化车间工程服务精选 - 品牌企业推荐师(官方)
  • 股票数据API(08)股票近一年各季度利润数据
  • sharepoint /children 支持按照修改时间查询吗
  • 2026年悬浮地板深度选型指南:不同需求下的方案匹配路径 - 速递信息
  • 油电同速,电池安全吗?长寿吗?
  • 每日一练:攻防世界「easyupload文件上传漏洞」详细解析与防御
  • 2026年质量好的超高清显示屏厂家推荐:指挥中心显示屏/甘肃会议室显示屏优质供应商推荐 - 品牌宣传支持者
  • 矛盾的普遍性
  • 基于纳什谈判理论的风–光–氢多主体能源系统合作运行方法 关键词:合作博弈 纳什谈判 风–光–氢...
  • 多目标人工秃鹫优化算法(MATLAB源码分享,智能优化算法):灵感源自非洲秃鹫的生活方式,开发...
  • 红海云如何助力大中型企业如何跨越人力资源管理“深水区”?
  • 京东 E 卡回收避坑全攻略!手把手教你安全高效变现闲置卡 - 团团收购物卡回收
  • 视频去重宝Gilisoft Video UniReel v18.7.0
  • 2026年太阳能光伏板废气治理厂家TOP5推荐