【学习笔记】数据结构与算法03:栈与队列

知识出处:Hello算法:https://www.hello-algo.com/.

文章目录

    • 2.2 栈和队列
      • 2.2.1 「栈 stack」
        • 2.2.1.1 栈的常用操作
        • 2.2.1.2 栈的典型应用
      • 2.2.2「队列 queue」
        • 2.2.2.1 队列的常用操作
        • 2.2.2.2 队列的典型应用
      • 2.2.3 双向队列 「double-ended queue」
        • 2.2.3.1 双向队列常用操作
        • 2.2.3.2 双向队列的应用场景

2.2 栈和队列

2.2.1 「栈 stack」

「栈 stack」是一种遵循先入后出逻辑的线性数据结构。

  • 堆叠元素的顶部称为“栈顶”
  • 底部称为“栈底”
  • 把元素添加到栈顶的操作叫作“入栈” (push,压栈,将数据压进去
  • 删除栈顶元素的操作叫作“出栈”(pop,出栈,像冒泡一样

栈的先入后出规则

2.2.1.1 栈的常用操作

通常情况下,我们可以直接使用编程语言内置的栈类(Java提供了栈的实现类Stack)

/* 初始化栈 */
Stack<Integer> stack = new Stack<>();/* 元素入栈 */
stack.push(1);
stack.push(3);
stack.push(2);
stack.push(5);
stack.push(4);/* 访问栈顶元素 */
int peek = stack.peek();/* 元素出栈 */
int pop = stack.pop();/* 获取栈的长度 */
int size = stack.size();/* 判断是否为空 */
boolean isEmpty = stack.isEmpty();
2.2.1.2 栈的典型应用
  • 浏览器中的后退与前进、软件中的撤销与反撤销。每当我们打开新的网页,浏览器就会对上一个网页执行入栈,这样我们就可以通过后退操作回到上一个网页。后退操作实际上是在执行出栈。如果要同时支持后退和前进,那么需要两个栈来配合实现。
  • 程序内存管理。每次调用函数时,系统都会在栈顶添加一个栈帧,用于记录函数的上下文信息。在递归函数中,向下递推阶段会不断执行入栈操作,而向上回溯阶段则会不断执行出栈操作。

2.2.2「队列 queue」

「队列 queue」是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断加入队列尾部,而位于队列头部的人逐个离开。

  • 队列头部称为“队首”
  • 尾部称为“队尾”
  • 把元素加入队尾的操作称为“入队”
  • 删除队首元素的操作称为“出队”

队列的先入先出规则

2.2.2.1 队列的常用操作

Java也提供了队列的实现。注意,和栈不一样,Queue<E> 是接口,在此基础上内置了大量的实现类以供使用,下面举例的是实现类是 LinkedList,它既实现了Deque(Queue),还实现了List。

/* 初始化队列 */
Queue<Integer> queue = new LinkedList<>();/* 元素入队 */
queue.offer(1);
queue.offer(3);
queue.offer(2);
queue.offer(5);
queue.offer(4);/* 访问队首元素 */
int peek = queue.peek();/* 元素出队 */
int pop = queue.poll();/* 获取队列的长度 */
int size = queue.size();/* 判断队列是否为空 */
boolean isEmpty = queue.isEmpty();
2.2.2.2 队列的典型应用
  • 处理集中爆发的大量订单。队列被大量运用在消息队列中,因此产生了很多MQ中间件。MQ被大量运用在淘宝订单,抢票,秒杀等场景中,用于处理短时间大量订单的情况
  • 按顺序处理代办事件。编程是抽象现实的过程,任何在现实中需要“排队”的场景都可以用到队列。比如打印机的任务队列,餐厅出餐的队列,还有线程池这样需要按顺序处理任务的场景,队列在这些场景中可以有效地维护处理顺序。

2.2.3 双向队列 「double-ended queue」

双向队列允许在头部和尾部执行元素的添加或删除操作,结合了栈和队列的特点,具有更高的灵活性。

2.2.3.1 双向队列常用操作

在Java中可以直接使用已提供了双向队列Deque(也是接口

  • push_first()将元素添加至队首
  • push_last()将元素添加至队尾
  • pop_first()删除队首元素
  • pop_last()删除队尾元素
  • peek_first()访问队首元素
  • peek_last()访问队尾元素
/* 初始化双向队列 */
Deque<Integer> deque = new LinkedList<>();/* 元素入队 */
deque.offerLast(2);   // 添加至队尾
deque.offerLast(5);
deque.offerLast(4);
deque.offerFirst(3);  // 添加至队首
deque.offerFirst(1);/* 访问元素 */
int peekFirst = deque.peekFirst();  // 队首元素
int peekLast = deque.peekLast();    // 队尾元素/* 元素出队 */
int popFirst = deque.pollFirst();  // 队首元素出队
int popLast = deque.pollLast();    // 队尾元素出队/* 获取双向队列的长度 */
int size = deque.size();/* 判断双向队列是否为空 */
boolean isEmpty = deque.isEmpty();
2.2.3.2 双向队列的应用场景

双向队列兼具栈与队列的逻辑,因此它可以实现这两者的所有应用场景,同时提供更高的自由度

很多栈和队列实现的场景都可以用双向队列来进行优化。比如同样是“使用栈来实现浏览器的前进和后退功能”,单纯使用单向的、先进后出的栈实现,会导致栈的长度过大,实际场景中需要限制栈的长度,这个时候就可以使用双向队列,比如当栈的长度>50时,每一次压栈后会将栈底的元素删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/485610.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据安全治理实践路线(上)

基于以上数据安全治理实践理念&#xff0c;可以按照自顶向下和自底向上相结合的思路推进实践过程。一方面&#xff0c;组织自顶向下,以数据安全战略规划为指导,以规划、建设、运营、优化为主线&#xff0c;围绕构建数据安全治理体系这一核心&#xff0c;从组织架构、制度流程、…

数据结构与算法——排序算法

目录 文章目录 前言 一.排序的基本概念 1.什么是就地排序 2.什么是内部排序和外部排序 3.什么是稳定排序 4.判定一个排序算法的是稳定的 二.插入排序算法 1.直接插入排序 1.1基本思想 1.2复杂度 1.3稳定性 1.4代码演示 2.折半插入排序 2.1基本思想 2.2性能 3.…

ubuntu20.04中配置Pyrep和CoppeliaSim

ubuntu20.04中配置Pyrep和CoppeliaSim 在Ubuntu20.04中配置 Pyrep &#xff0c;实现应用Python语言的机器人在 Vrep&#xff08;CoppeliaSim&#xff09;中的虚拟仿真 一、安装CoppeliaSim 4.1 1.1 下载适配Ubuntu20.04的CoppeliaSim 4.1软件 下载链接&#xff1a;https://…

《剑指Offer》笔记题解思路技巧优化_Part_6

《剑指Offer》笔记&题解&思路&技巧&优化_Part_6 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题&#x1f7e1;1.LCR 168. 丑数—— 丑数&#x1f7e2;2. LCR 16…

SQLite 的使用

SQLite 是一个轻量级、自包含和无服务器的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛应用于嵌入式系统、移动应用程序和小中型网站。它易于创建、需要的配置较少&#xff0c;并且提供了用于管理和操作数据的强大功能集。本文&#xff0c;我们将带领你…

洛谷P3371【模板】单源最短路径(弱化版)(RE版本和AC版本都有,这篇解析很长但受益匪浅)

解释一下什么叫邻接矩阵&#xff1a; 假设有以下无向图&#xff1a; 1/ \2---3/ \ / \4---5---6对应的邻接矩阵为&#xff1a; 1 2 3 4 5 6 1 0 1 1 0 0 0 2 1 0 1 1 1 0 3 1 1 0 0 1 1 4 0 1 0 0 1 0 5 0 1 1 1 0 1 6 0 0 1 0 1 0 …

日月光投控以近5亿元收购英飞凌2座封测厂 | 百能云芯

日月光投控&#xff08;ASE Group&#xff09;日前宣布&#xff0c;计划以逾人民币4.78亿元收购德国芯片大厂英飞凌&#xff08;Infineon&#xff09;旗下位于菲律宾和韩国的两座后段封测厂。这一举措旨在扩大日月光在车用和工业自动化应用的电源芯片模组封测与导线架封装方面的…

Redis 工具类 与 Redis 布隆过滤器

Redis 工具类 1. 核心依赖 <!--redis--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency><groupId>com.google.guava…

【行业交流】优积科技·国住人居与广东保利就学校、居住场景下模块化建筑技术的运用进行交流

近日&#xff0c;保利发展控股集团股份有限公司&#xff08;以下简称“保利发展”&#xff09;、 优积建筑科技发展(上海)有限公司&#xff08;以下简称“优积科技”&#xff09;、国住人居工程顾问有限公司&#xff08;以下简称“国住人居公司”&#xff09;就模块化建造体系与…

pytorch保存张量为图片

这里用到的是torchvision中的save_image。 废话不多说&#xff0c;直接来代码&#xff1a; import torch from torchvision.utils import save_image B, C, H, W 64, 3, 32, 32 input_tensor torch.randn(B, C, H, W) save_image(input_tensor, "hh.png", nrow8)…

【TCP/IP】组播

一、组播介绍 组播&#xff08;Multicast&#xff09;是网络技术中数据传输的一种方法&#xff0c;它允许将数据包同时发送给一组指定的目标&#xff0c;而不是单个的目标&#xff08;单播 Unicast&#xff09;或所有可能的目标&#xff08;广播 Broadcast&#xff09;。组播传…

【计算机网络】一些乱七八糟内容

MAC Media Access Control 用于在局域网&#xff08;LAN&#xff09;或广域网&#xff08;WAN&#xff09;中实现设备自动接入网络 "载波侦听多路访问"(Carrier Sense Multiple Access) CSMA/CD 是CSMA的升级版本&#xff0c;加入了序列号检测机制。 CSMA/CA 是CSM…