【学习笔记】数据结构与算法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://xiahunao.cn/news/2803705.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

论文阅读——SimpleClick

SimpleClick: Interactive Image Segmentation with Simple Vision Transformers 模型直接在VIT上增加交互是分割 用VIT MAE方法训练的预训练权重 用交互式分割方法微调&#xff0c;微调流程&#xff1a; 1、在当前分割自动模拟点击&#xff0c;没有人为提供的点击 受到RITM启发…

如何使用Douglas-042为威胁搜索和事件应急响应提速

关于Douglas-042 Douglas-042是一款功能强大的PowerShell脚本&#xff0c;该脚本可以提升数据分类的速度&#xff0c;并辅助广大研究人员迅速从取证数据中筛选和提取出关键数据。 该工具能够搜索和识别Windows生态系统中潜在的安全漏洞&#xff0c;Douglas-042会将注意力放在…

Jmeter基础(2) 目录介绍

目录 Jmeter目录介绍bin目录docsextrasliblicensesprintable_docs Jmeter目录介绍 在学习Jmeter之前&#xff0c;需要先对工具的目录有些了解&#xff0c;也会方便后续的学习 bin目录 examplesCSV目录中有CSV样例jmeter.batwindow 启动文件jmeter.shMac/linux的启动文件jmete…

学习负载均衡的算法

什么负载均衡 负载均衡是一种计算机技术&#xff0c;用于在多个系统、网络链接、硬盘驱动器、CPU等之间分配工作负载&#xff0c;以优化资源使用、最大化吞吐量、最小化响应时间、并避免任何单一资源的过载。在网络负载均衡的情况下&#xff0c;它可以帮助将网络流量有效地分配…

300分钟吃透分布式缓存-11讲:MC如何淘汰冷key和失效key?

淘汰策略 Mc 作为缓存组件&#xff0c;意味着 Mc 中只能存储访问最频繁的热数据&#xff0c;一旦存入数据超过内存限制&#xff0c;就需要对 Mc 中的冷 key 进行淘汰工作。Mc 中的 key 基本都会有过期时间&#xff0c;在 key 过期后&#xff0c;出于性能考虑&#xff0c;Mc 并…

SpringBoot中Redis缓存的使用

目录 1 前言 2 实现方法 2.1 查询数据时 2.2 修改数据 1 前言 对于一些不常改变&#xff0c;但又经常查询的数据&#xff0c;我们可以使用Redis缓存&#xff0c;来缓解数据库的压力&#xff0c;其中的逻辑如下&#xff1a; 2 实现方法 2.1 查询数据时 一般在控制类查询方…

SMIC思洣客矩阵:重塑数字经济的未来

经济的发展 经济是供需满足的过程&#xff0c;它涵盖了社会物资的生产和再生产过程。在这个过程中&#xff0c;经济活动遵循着生产和再生产的规律&#xff0c;通过生产、分配、交换和消费的过程&#xff0c;不断地形成和再造价值。从传统的市场经济到现代的智能经济&#xff0…

Shell好用的工具: cut

目标 使用cut可以切割提取指定列\字符\字节的数据 介绍 cut 译为“剪切, 切割” , 是一个强大文本处理工具&#xff0c;它可以将文本按列进行划分的文本处理。cut命令逐行读入文本&#xff0c;然后按列划分字段并进行提取、输出等操作。 语法 cut [options] filename opti…

快速学习安全框架 Springsecurity最新版(6.2)--用户授权模块

简介 上一节Springsecurity 用户认证 Springsecurity 拥有强大的认证和授权功能并且非常灵活&#xff0c;,一来说我们都i有以下需求 可以帮助应用程序实现以下两种常见的授权需求&#xff1a; 用户-权限-资源&#xff1a;例如张三的权限是添加用户、查看用户列表&#xff0c;李…

1.1_1 计算机网络的概念、功能、组成和分类

文章目录 1.1_1 计算机网络的概念、功能、组成和分类&#xff08;一&#xff09;计算机网络的概念&#xff08;二&#xff09;计算机网络的功能&#xff08;三&#xff09;计算机网络的组成1.组成部分2.工作方式3.功能组成 &#xff08;四&#xff09;计算机网络的分类 总结 1.…

频段划分学习射频知识的意义

一、射频电路设计与低频电路设计的不同点 随着频率提高&#xff0c;相应电磁波的波长与变得可与分立电路元件的尺寸相比拟时&#xff0c;电阻、电容和电感这些元件的电响应&#xff0c;将偏离他们的理想频率特性。以 WIFI 2.4G 频段为例&#xff0c;当频率为 2437MHz&#xff0…

快速排序、归并排序和堆排序的原理与实现

排序算法是计算机科学中的基本算法之一&#xff0c;用于将一组元素按照一定顺序排列。快速排序、归并排序和堆排序是三种常见的排序算法&#xff0c;各有其特点和适用场景。 快速排序 (Quick Sort) 快速排序是一种经典的分而治之的排序算法。其基本思想是选择一个基准元素&am…

Chat With RTX 安装、使用问题记录

1.安装包运行检测环境失败 安装适合的的CUDA&#xff1a;https://developer.nvidia.com/cuda-downloads?target_osWindows&target_archx86_64&target_version11 2.安装Chat With RTX 和 模型 Mistral 7B 失败 科学上网&#xff0c;可以单独装Chat With RTX 先&…

实习日志30

概要 高拍仪硬件通信原理&#xff0c;WebSocket源码解析&#xff08;JavaScript&#xff09; WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据…

智能科技助力服装业:商品计划管理系统的革命性变革

随着智能科技的飞速发展&#xff0c;服装行业正在经历前所未有的变革。在这股浪潮中&#xff0c;商品计划管理系统的智能化转型成为了行业的核心驱动力。这种变革不仅极大地提高了服装企业的运营效率和市场竞争力&#xff0c;更为整个行业的可持续发展注入了新的活力。 智能商…

【Power Apps】实现一个简单的可编辑列表

简单来说&#xff0c;我们这次是要实现一个可以直接在列表上增加、修改、删除数据的功能。 大概就像这样。 之前我们都是拿列表做一个数据展示的功能&#xff0c;真要增加、修改、删除数据是在另一张表单上做的&#xff0c;我们这回要去掉另一个表单&#xff0c;直接在列表上做…

ProtoBuf认识与Windows下的安装

protobuf简介 Protobuf 是 Protocol Buffers 的简称&#xff0c;它是 Google 公司开发的一种数据描述语言&#xff0c;是一种轻便高效的结 构化数据存储格式&#xff0c;可以用于结构化数据&#xff0c;或者说序列化。它很适合做数据存储 或 RPC 数据交换格 式 。可用于通讯…

qt 软件发布(Windows)

1. 开发环境 QtCreator MSVC编译器 2. 源码编译 生成release或者debug版本的exe可执行文件(x64或x86) 3. windeployqt 打包 ①左下角开始菜单栏找到QT的命令交互对话框&#xff0c;如下图MSVC 2017 64-bit(根据第二步编译的类型选择64位或者32位)。 ②cd 切换到第二步可…

vue实现拖拽(vuedraggable)

实现效果: 左侧往右侧拖动&#xff0c;右侧列表可以进行拖拽排序。 安装引用&#xff1a; npm install vuedraggable import draggable from vuedraggable 使用&#xff1a; data数据&#xff1a; componentList: [{groupName: 考试题型,children: [{componentType: danxua…

数字信号处理:傅里叶分析

本文主要参考视频如下&#xff1a; 数字信号处理9-1_线性时不变系统对复指数信号的响应_哔哩哔哩_bilibili 傅里叶分析的主要研究内容如下所示&#xff1a; 注意&#xff0c;计算机中使用的离散傅里叶变换并不是离散时间傅里叶变换&#xff1b; 前四种都是理论上的变换方式&…