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

数据结构--栈(Stack) 队列(Queue)

一、栈(Stack)

1. 栈的定义

  • 栈(Stack)是一种 先进后出(LIFO, Last In First Out) 的数据结构。

  • 就像一摞书:最后放的书最先拿走。


2. 栈的常用方法(Stack 类)

  • Stack<E> 继承自 Vector,是 线程安全 的,但性能一般。

  • 更推荐使用 Deque<E>(如 ArrayDequeLinkedList)来实现栈结构。

方法功能描述备注
push(E e)将元素压入栈顶相当于入栈操作
pop()弹出栈顶元素,并返回该元素栈为空时会抛 EmptyStackException
peek()查看栈顶元素,但不删除栈为空时会抛 EmptyStackException
empty()判断栈是否为空返回 truefalse
search(Object o)返回元素在栈中的位置(从 1 开始,栈顶为 1)找不到返回 -1

3. 使用示例

  • Stack<E> 继承自 Vector,是 线程安全 的,但性能一般。(下面的(1))

  • 更推荐使用 Deque<E>(如 ArrayDequeLinkedList)来实现栈结构。(下面的(2))

(1)使用 Stack
Stack<Integer> stack = new Stack<>();
stack.push(10);
stack.push(20);
stack.push(30);System.out.println(stack.peek()); // 30
System.out.println(stack.pop());  // 30
System.out.println(stack.pop());  // 20
System.out.println(stack.empty()); // false
(2)使用 ArrayDeque 模拟栈(推荐)
Deque<String> stack = new ArrayDeque<>();
stack.push("A");
stack.push("B");
stack.push("C");System.out.println(stack.pop()); // C
System.out.println(stack.peek()); // B

4. 栈的应用场景

  • 函数调用栈:保存方法调用现场(局部变量、返回地址等)。

  • 括号匹配:比如判断 ({[]}) 是否匹配。

  • 表达式求值:逆波兰表达式(后缀表达式)。

  • 回溯算法:比如迷宫寻路。

二、队列(Queue)

1. 队列的定义

  • 队列(Queue)是一种 先进先出(FIFO, First In First Out) 的数据结构。

  • 就像排队买票:先排队的人先买,后排的人要等前面的人买完。

  • 在 Java 中,Queue 是一个接口,继承自 Collection 接口。


2. 队列的常用方法(来自 Queue 接口)

方法功能
boolean add(E e)向队列尾部插入元素,若失败抛异常
boolean offer(E e)向队列尾部插入元素,失败时返回 false
E remove()删除并返回队首元素,队列为空时抛异常
E poll()删除并返回队首元素,队列为空时返回 null
E element()返回队首元素但不删除,队列为空时抛异常
E peek()返回队首元素但不删除,队列为空时返回 null

3. 常见的队列实现类

(1)LinkedList
  • LinkedList 实现了 Queue 接口,可以作为普通队列使用。

Queue<String> queue = new LinkedList<>();
queue.offer("A");
queue.offer("B");
queue.offer("C");
System.out.println(queue.poll()); // A
System.out.println(queue.peek()); // B
(2)PriorityQueue(优先队列)
  • 元素按 优先级排序(默认是自然顺序,小的优先)。

Queue<Integer> pq = new PriorityQueue<>();
pq.offer(5);
pq.offer(1);
pq.offer(3);
System.out.println(pq.poll()); // 1
System.out.println(pq.poll()); // 3
(3)ArrayDeque(双端队列)
  • 推荐的队列实现,比 LinkedList 更高效。

  • 可以当队列(FIFO)或栈(LIFO)使用。

Queue<String> dq = new ArrayDeque<>();
dq.offer("A");
dq.offer("B");
System.out.println(dq.poll()); // A

4. 队列的应用场景

  • 排队系统:比如消息队列(RabbitMQ、Kafka)。

  • 缓冲区:比如网络 IO 中的数据缓冲。

  • 广度优先搜索(BFS):图/树的层序遍历。


三、栈和队列对比

特点栈(Stack)队列(Queue)
存取顺序LIFO(先进后出)FIFO(先进先出)
典型操作push 入栈,pop 出栈offer 入队,poll 出队
Java 实现类Stack, ArrayDequeLinkedList, ArrayDeque, PriorityQueue
应用场景函数调用栈、表达式计算、回溯消息队列、BFS、排队系统

总结

  • :适合 回溯 / 嵌套处理,强调后进先出。

  • 队列:适合 排队 / 顺序处理,强调先来先服务。

  • 推荐 使用 ArrayDeque 来实现队列和栈,性能比 LinkedListStack 更好。

http://www.xdnf.cn/news/19398.html

相关文章:

  • Python API接口实战指南:从入门到精通
  • Linux查看有线网卡和无线网卡详解
  • 【Linux】基础I/O和文件系统
  • 初学者如何学习项目管理
  • 计算机毕设javayit商城 基于SSM框架的校园二手交易全流程管理系统设计与实现 Java+MySQL的校园二手商品交易与供需对接平台开发
  • 【嵌入式原理系列-第六篇】从Flash到RAM:MCU ld脚本全解析
  • TuringComplete游戏攻略(一、基础逻辑电路)
  • Python Facebook Logo
  • 神经网络正则化三重奏:Weight Decay, Dropout, 和LayerNorm
  • ARM 裸机开发 知识点
  • 豌豆压缩怎么用?3步避免网盘资源被和谐 网盘压缩包总被和谐?豌豆压缩实测解析 豌豆压缩避坑指南:敏感资源存储必读
  • 雷卯国产化之SE3401完全替代AOS的AO3401
  • 数字签名 digital signature
  • 年化225%,回撤9%,夏普4.32,3积分可查看参数
  • Java 常见异常系列:ClassNotFoundException 类找不到
  • Java 学习笔记(基础篇12)
  • 学习Python中Selenium模块的基本用法(10:浏览器操作)
  • 让演化可编程:XLang 与可逆计算的结构化范式
  • [ZJCTF 2019]NiZhuanSiWei
  • 第2节:项目前期准备
  • C++抽象类
  • 【Python 后端框架】总结
  • Nginx反向代理与负载均衡
  • 基于单片机指纹考勤系统/智能考勤
  • DeepSeek应用技巧-通过MCP打造数据分析助手
  • YOLOv11 训练参数全解析:一文掌握 epochs、batch、optimizer 调优技巧
  • kali下sqlmap更新失败问题
  • PB-重装系统后,重新注册ole控件,pb中窗口控件失效的问题。
  • 不用公网IP也能?cpolar实现Web-Check远程安全检测(1)
  • 2025年09月计算机二级MySQL选择题每日一练——第十二期