【算法与数据结构】--常见数据结构--栈和队列
一、栈
栈(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…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
