【算法与数据结构】--常见数据结构--栈和队列
一、栈
栈(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…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
Windows 下端口占用排查与释放全攻略
Windows 下端口占用排查与释放全攻略 在开发和运维过程中,经常会遇到端口被占用的问题(如 8080、3306 等常用端口)。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口,帮助你高效解决此类问题。 一、准…...
GAN模式奔溃的探讨论文综述(一)
简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...
