【算法与数据结构】--常见数据结构--栈和队列
一、栈
栈(Stack) 是一种基本的数据结构,具有后进先出(LIFO)的特性,类似于现实生活中的一叠盘子。栈用于存储一组元素,但只允许在栈顶进行插入(入栈)和删除(出栈)操作。以下是栈的关键特性和操作:
1.1 栈的特性:
- 后进先出(LIFO):最后进栈的元素将首先出栈,类似于将盘子放在一叠盘子的顶部,取盘子时总是从顶部开始。
- 只能操作栈顶元素:栈只允许对栈顶元素进行插入和删除操作,其他元素必须等待。
1.2 栈的基本操作:
- 入栈(Push):将元素添加到栈顶。
- 出栈(Pop):移除栈顶元素,并返回它。
- 查看栈顶元素(Peek):查看栈顶元素的值,但不将其移出栈。
1.3 代码示例:
- C# 示例
using System;
using System.Collections.Generic;class Program
{static void Main(){Stack<int> stack = new Stack<int>();// 入栈stack.Push(1);stack.Push(2);stack.Push(3);// 出栈int poppedItem = stack.Pop();Console.WriteLine("Popped: " + poppedItem); // 输出:Popped: 3// 查看栈顶元素int topItem = stack.Peek();Console.WriteLine("Top: " + topItem); // 输出:Top: 2// 遍历栈while (stack.Count > 0){int item = stack.Pop();Console.WriteLine(item);}}
}
- Java 示例:
import java.util.Stack;public class Main {public static void main(String[] args) {Stack<Integer> stack = new Stack<>();// 入栈stack.push(1);stack.push(2);stack.push(3);// 出栈int poppedItem = stack.pop();System.out.println("Popped: " + poppedItem); // 输出:Popped: 3// 查看栈顶元素int topItem = stack.peek();System.out.println("Top: " + topItem); // 输出:Top: 2// 遍历栈while (!stack.isEmpty()) {int item = stack.pop();System.out.println(item);}}
}
这些代码示例演示了如何在C# 和 Java 中使用内置的栈数据结构,执行入栈、出栈、查看栈顶元素以及遍历栈的操作。栈是一种重要的数据结构,在算法和数据处理中有广泛的应用。
二、队列
队列(Queue) 是一种基本的数据结构,具有先进先出(FIFO)的特性,类似于现实生活中排队等候的情景。队列用于存储一组元素,并允许在队列的一端插入元素(入队),在另一端删除元素(出队)。以下是队列的关键特性和操作:
2.1 队列的特性:
- 先进先出(FIFO):最早入队的元素将最早出队,类似于排队时最早到达的人会最早被服务。
- 只能操作队头和队尾:队列允许在队尾进行入队操作,在队头进行出队操作,其他元素必须等待。
2.2 队列的基本操作:
- 入队(Enqueue):将元素添加到队列的尾部。
- 出队(Dequeue):移除队列的头部元素,并返回它。
- 查看队头元素(Peek):查看队列头部元素的值,但不将其出队。
2.3 队列的应用:
- 队列常用于多种情况,包括任务调度、广度优先搜索、缓冲等需要维护元素的先后顺序的问题。
2.4 代码示例:
- C#示例:
using System;
using System.Collections.Generic;class Program
{static void Main(){Queue<int> queue = new Queue<int>();// 入队queue.Enqueue(1);queue.Enqueue(2);queue.Enqueue(3);// 出队int dequeuedItem = queue.Dequeue();Console.WriteLine("Dequeued: " + dequeuedItem); // 输出:Dequeued: 1// 查看队头元素int frontItem = queue.Peek();Console.WriteLine("Front: " + frontItem); // 输出:Front: 2// 遍历队列foreach (int item in queue){Console.WriteLine(item);}}
}
- Java示例:
import java.util.LinkedList;
import java.util.Queue;public class Main {public static void main(String[] args) {Queue<Integer> queue = new LinkedList<>();// 入队queue.offer(1);queue.offer(2);queue.offer(3);// 出队int dequeuedItem = queue.poll();System.out.println("Dequeued: " + dequeuedItem); // 输出:Dequeued: 1// 查看队头元素int frontItem = queue.peek();System.out.println("Front: " + frontItem); // 输出:Front: 2// 遍历队列for (int item : queue) {System.out.println(item);}}
}
这些代码示例演示了如何在C# 和 Java 中使用内置的队列数据结构,执行入队、出队、查看队头元素以及遍历队列的操作。队列是一种重要的数据结构,在许多情况下用于维护元素的顺序,特别是在多线程和并发编程中,队列非常有用。
三、应用场景
队列和栈是两种常见的数据结构,它们在不同应用场景中发挥着重要的作用:
3.1 队列的应用场景:
- 任务调度:队列常用于多任务调度,确保任务按照特定顺序执行。例如,操作系统中的进程调度,打印队列中的文档,或者异步任务队列。
- 广度优先搜索(BFS):在图算法中,BFS 使用队列来实现,以探索图中的节点。这在寻找最短路径、社交网络分析和推荐系统等应用中非常有用。
- 缓冲:队列用于缓冲数据,以平衡生产者和消费者之间的速度差异。消息队列(如RabbitMQ和Kafka)用于解耦组件,处理大量数据。
- 线程调度:多线程应用中,线程池通常使用队列来存储待处理的任务。新任务入队,空闲线程出队执行任务,确保任务按照先来先服务的原则执行。
- Web请求管理:Web服务器通常使用队列来管理接收到的请求,以便逐个处理它们,避免过载和提供更好的性能。
3.2 栈的应用场景:
- 函数调用:编程中,函数调用栈用于跟踪函数的嵌套调用。每个函数调用都将当前状态压入栈,返回后再从栈中弹出。
- 逆波兰表达式和计算器:栈用于解析和计算逆波兰表达式,它允许处理操作符的优先级和括号。
- 撤销功能:许多应用程序(如文本编辑器、图像编辑器)使用栈来记录用户的操作历史,以便提供撤销和重做功能。
- 括号匹配:栈用于检查表达式中的括号是否匹配,例如在编译器中检查代码的语法。
- 浏览器历史记录:浏览器中的“后退”和“前进”按钮通常使用栈来维护访问过的页面历史记录。
- 深度优先搜索(DFS):在图算法中,DFS 通常使用递归和栈来实现,以探索图的节点。
这些是队列和栈的一些主要应用场景。它们在许多领域都具有重要作用,帮助解决了各种问题,从任务调度到数据结构的操作和搜索算法。根据具体的问题需求,选择正确的数据结构可以极大地提高算法和应用的效率。
四、总结
栈(Stack)是一种基本的数据结构,具有后进先出(LIFO)的特性,类似于现实生活中的一叠盘子。栈用于存储一组元素,但只允许在栈顶进行插入(入栈)和删除(出栈)操作。栈的主要特性包括后进先出(LIFO)和只能操作栈顶元素。栈的基本操作包括入栈(Push)、出栈(Pop)、和查看栈顶元素(Peek)。
队列(Queue)是一种基本的数据结构,具有先进先出(FIFO)的特性,类似于现实生活中排队等候的情景。队列用于存储一组元素,允许在队列的一端插入元素(入队)和在另一端删除元素(出队)。队列的主要特性包括先进先出(FIFO)和只能操作队头和队尾元素。队列的基本操作包括入队(Enqueue)、出队(Dequeue)、和查看队头元素(Peek)。
栈常用于需要按照相反顺序处理数据的场景,如函数调用、逆波兰表达式求值和历史记录的撤销功能。队列通常用于需要维护元素的先后顺序,如任务调度、广度优先搜索和数据缓冲。
相关文章:
【算法与数据结构】--常见数据结构--栈和队列
一、栈 栈(Stack) 是一种基本的数据结构,具有后进先出(LIFO)的特性,类似于现实生活中的一叠盘子。栈用于存储一组元素,但只允许在栈顶进行插入(入栈)和删除(…...
Linux shell编程学习笔记11:关系运算
Linux Shell 脚本编程和其他编程语言一样,支持算数、关系、布尔、字符串、文件测试等多种运算。前面几节我们研究了 Linux shell编程 中的 字符串运算 和 算术运算,今天我们来研究 Linux shell编程中的的关系运算。 一、关系运算符功能说明 运算符说明…...
JS标准库
学习一门编程语言不仅是掌握其语法。同等重要的是学习其标准库,从而熟练掌握语言本身提供的所有工具。 1 定型数组 js常规数组与C和Java等较低级语言的数组类型还是有很大区别。ES6新增了定型数组,与这些语言的低级数组非常接近。 定型数组严格来说并…...
Android 12.0 hal层添加自定义hal模块功能实现
1. 前言 在12.0的系统rom定制化开发中,在 对hal模块进行开发时,需要通过添加自定义的hal模块来实现某些功能时,就需要添加hal模块的相关功能,接下来就来实现一个案例来供参考 接下来就来具体实现这个功能 2.hal层添加自定义hal模块功能实现的核心类 hardware\interfaces…...
如何理解vue声明式渲染
Vue.js中的声明式渲染是一种用来描述用户界面的方式,它强调“声明”应该如何渲染页面,而不需要关心底层的DOM操作。这与传统的命令式渲染方式,即手动控制DOM元素的创建、更新和销毁,形成了鲜明的对比。 理解Vue的声明式渲染的关键…...
【已解决】Vue全局引入scss 个别页面不生效 / 不自动引入全局样式
项目里配置了全局样式的引入,今天新建了 demo 页面去修改 element 的样式,发现全局的样式没有引入进来。 问题原因 在此页面 没有任何样式导致的 项目在编译的时候,会把 .vue 文件的样式抽离到单独的 css 文件中。 当该页面没有css代码的时…...
MySQL之双主双从读写分离
一个主机 Master1 用于处理所有写请求,它的从机 Slave1 和另一台主机 Master2 还有它的从 机 Slave2 负责所有读请求。当 Master1 主机宕机后, Master2 主机负责写请求, Master1 、 Master2 互为备机。架构图如下 : 准备 我们…...
使用eBPF加速阿里云服务网格ASM
背景 随着云原生应用架构的快速发展,微服务架构已经成为了构建现代应用的主要方式之一。而在微服务架构中,服务间的通信变得至关重要。为了实现弹性和可伸缩性,许多组织开始采用服务网格技术来管理服务之间的通信。 Istio作为目前最受欢迎的…...
大型数据集处理之道:深入了解Hadoop及MapReduce原理
在大数据时代,处理海量数据是一项巨大挑战。而Hadoop作为一个开源的分布式计算框架,以其强大的处理能力和可靠性而备受推崇。本文将介绍Hadoop及MapReduce原理,帮助您全面了解大型数据集处理的核心技术。 Hadoop简介 Hadoop是一个基于Google…...
LCR 095. 最长公共子序列(C语言+动态规划)
1. 题目 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(…...
程序员不写注释:探讨与反思
一、为什么程序员不写注释 当程序员选择不写注释时,通常有一系列常见原因,这些原因可以影响他们的决策和行为。同时,这个决策可能会带来多方面的影响和后果。以下是详细阐述为什么程序员不写注释的常见原因以及这种决策可能导致的影响和后果…...
《论文阅读:Dataset Condensation with Distribution Matching》
点进去这篇文章的开源地址,才发现这篇文章和DC DSA居然是一个作者,数据浓缩写了三篇论文,第一篇梯度匹配,第二篇数据增强后梯度匹配,第三篇匹配数据分布。DC是匹配浓缩数据和原始数据训练一次后的梯度差,DS…...
免费chatGPT工具
发现很多人还是找不到好用的chatGPT工具,这里分享一个邮箱注册即可免费试用。 PromptsZone - 一体化人工智能平台使用 PromptsZone 与 ChatGPT、Claude、AI21 Labs、Google Bard 聊天,并使用 DALL-E、Stable Diffusion 和 Google Imagegen 创建图像&…...
数据分析基础:数据可视化+数据分析报告
数据分析是指通过对大量数据进行收集、整理、处理和分析,以发现其中的模式、趋势和关联,并从中提取有价值的信息和知识。 数据可视化和数据分析报告是数据分析过程中非常重要的两个环节,它们帮助将数据转化为易于理解和传达的形式࿰…...
settings.xml的文件配置大全
settings.xml 文件中最常配置的还是这几个标签 localRepository和mirrors settings.xml文件官方文档地址 <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"ht…...
极简c++(7)类的继承
为什么要用继承 子类不必复制父类的任何属性,已经继承下来了;易于维护与编写; 类的继承与派生 访问控制规则 一般只使用Public! 构造函数的继承与析构函数的继承 构造函数不被继承! 在创建子类对象的时候&…...
DOSBox和MASM汇编开发环境搭建
DOSBox和MASM汇编开发环境搭建 1 安装DOSBox2 安装MASM3 编译测试代码4 运行测试代码5 调试测试代码 本文属于《 X86指令基础系列教程》之一,欢迎查看其它文章。 1 安装DOSBox 下载DOSBox和MASM:https://download.csdn.net/download/u011832525/884180…...
047:mapboxGL本地上传shp文件,在map上解析显示图形
第047个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中本地上传shp文件,利用shapefile读取shp数据,并在地图上显示图形。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共117行)加载shapefile.js方式…...
Windows下DataGrip连接Hive
DataGrip连接Hive 1. 启动Hadoop2. 启动hiveserver2服务3. 启动元数据服务4. 启动DG 1. 启动Hadoop 在控制台中输入start-all.cmd后,弹出下图4个终端(注意终端的名字)2. 启动hiveserver2服务 单独开一个窗口启动hiveserver2服务,…...
Xshell7和Xftp7超详细下载教程(包括安装及连接服务器附安装包)
1.下载 1.官网地址: XSHELL - NetSarang Website 选择学校免费版下载 2.将XSHELL和XFTP全都下载下来 2.安装 安装过程就是选择默认选项,然后无脑下一步 3.连接服务器 1.打开Xshell7,然后新建会话 2.填写相关信息 出现Connection establi…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...
【笔记】结合 Conda任意创建和配置不同 Python 版本的双轨隔离的 Poetry 虚拟环境
如何结合 Conda 任意创建和配置不同 Python 版本的双轨隔离的Poetry 虚拟环境? 在 Python 开发中,为不同项目配置独立且适配的虚拟环境至关重要。结合 Conda 和 Poetry 工具,能高效创建不同 Python 版本的 Poetry 虚拟环境,接下来…...
