栈与队列:常见的线性数据结构

栈(Stack)和队列(Queue)是计算机科学中常见的线性数据结构,它们在许多算法和编程场景中发挥着重要作用。它们的不同特点和用途使得它们适用于不同的问题和应用。

栈(Stack)

栈,作为一种线性数据结构,其特点在于遵循后进先出(Last-In-First-Out,LIFO)的原则。这意味着最后一个进入栈的元素将第一个被弹出,而最先进入的元素将成为最后被弹出的。这一奇妙的特性使得栈在许多实际问题中得到广泛应用。

回想一下现实生活中的例子,我们可以将栈类比为堆叠的盘子。当我们往堆叠中放入一叠盘子时,最后放入的盘子会在顶部,而取出盘子时也是从顶部开始取。这种方式保证了后放入的盘子最先被取走,而先放入的盘子则被压在下面。

栈的操作

栈支持以下两种主要操作:

  1. 入栈(Push):将元素放入栈的顶部。
  2. 出栈(Pop):从栈的顶部取出元素。

栈的一个重要特性是,只能访问栈顶的元素,其他元素都无法直接访问。这种特性使得栈在许多问题中都有用处,如逆波兰表达式求值、括号匹配、函数调用的调用栈等。

括号匹配

这里我们举一个括号字符串,需要判断其中的括号是否匹配。

#include <iostream>
#include <stack>
#include <string>bool isBracketMatched(const std::string& expression) {std::stack<char> brackets; // 创建字符栈for (char ch : expression) {if (ch == '(' || ch == '[' || ch == '{') {brackets.push(ch); // 将左括号入栈} else if (ch == ')' || ch == ']' || ch == '}') {if (brackets.empty()) {return false; // 出现未匹配的右括号}char topBracket = brackets.top(); // 获取栈顶元素brackets.pop(); // 弹出栈顶元素if ((ch == ')' && topBracket != '(') ||(ch == ']' && topBracket != '[') ||(ch == '}' && topBracket != '{')) {return false; // 括号不匹配}}}return brackets.empty(); // 检查是否还有未匹配的括号
}int main() {std::string expression = "{[()]()}";if (isBracketMatched(expression)) {std::cout << "括号匹配。" << std::endl;} else {std::cout << "括号不匹配。" << std::endl;}return 0;
}

队列(Queue)

队列是另一种具有特定操作规则的线性数据结构,遵循先进先出的原则。队列可以想象成排队的人,先到先得,后到后得。

与栈不同,队列是另一种常见的线性数据结构,它遵循先进先出(First-In-First-Out,FIFO)的原则。这意味着最早进入队列的元素将最先被弹出,而最后进入的元素将成为最后被弹出的。这一特性使得队列在诸多场景中都能发挥出色的效果。

在日常生活中,队列的例子随处可见。想象一下排队购买电影票的场景:最早来排队的人会最早买到票,而后来的人则会排在后面依次等候。这种先来先服务的原则保证了排队者的公平性。

在计算机领域,队列同样扮演着重要角色。操作系统中的任务调度、打印队列管理以及网络数据传输等领域都广泛使用队列来管理任务和数据。例如,操作系统会使用队列来管理待执行的任务,确保每个任务都能按照顺序得到执行。

队列的操作

队列支持以下两种主要操作:

  1. 入队(Enqueue):将元素放入队列的末尾。
  2. 出队(Dequeue):从队列的开头取出元素。

队列的一个关键特点是,只有队列头部的元素可以被访问和移除,而队列尾部的元素只能被插入。队列在许多应用中都很有用,如任务调度、广度优先搜索等。

任务调度

这里笔者举一个任务调度的案例,有多个任务需要执行,但每个任务需要等待一段时间才能执行。

#include <iostream>
#include <queue>
#include <string>void scheduleTasks(const std::vector<std::string>& tasks, int delay) {std::queue<std::string> taskQueue; // 创建字符串队列for (const std::string& task : tasks) {taskQueue.push(task); // 将任务入队}while (!taskQueue.empty()) {std::string currentTask = taskQueue.front(); // 获取队头任务taskQueue.pop(); // 出队std::cout << "执行任务:" << currentTask << std::endl;if (!taskQueue.empty()) {std::cout << "等待 " << delay << " 秒..." << std::endl;// 模拟延迟(以秒为单位)// 在实际场景中,可能会使用 sleep 函数// std::this_thread::sleep_for(std::chrono::seconds(delay));}}
}int main() {std::vector<std::string> tasks = {"任务1", "任务2", "任务3", "任务4"};int delay = 2;scheduleTasks(tasks, delay);return 0;
}

总结

栈和队列作为常见的线性数据结构,分别以后进先出和先进先出的原则为基础,广泛应用于算法、编程和软件开发等领域。它们的独特特性使得它们能够优雅地解决各种问题,从模拟现实场景到优化算法流程。通过深入理解栈和队列的原理和应用,我们能够更加灵活地运用它们来解决复杂的计算机科学问题,为软件开发和算法设计带来更多可能性。

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

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

相关文章

身为程序员,你有哪些提高写代码效率的工具?

首先&#xff0c;每个程序员都是会利用工具的人&#xff0c;也有自己囊里私藏的好物。独乐乐不如众乐乐&#xff0c;今天笔者整理了3个辅助我们写代码的黑科技&#xff0c;仅供参考。如果你有更好的工具&#xff0c;欢迎评论区分享。 1、Google/Stackoverflow——搜索解决方案的…

【运维】linux安装oracle客户端、安装mysql

文章目录 一. 下载二. 配置1. 配置环境变量2. 配置tnsnames.ora文件 三. 测试1. 链接语法2. 连接测试 四. 通过rpm安装mysql 一. 下载 下载地址 基础包 连接工具 二. 配置 上传、解压、配置环境变量 这里安装在/data01目录下 unzip instantclient-sqlplus-linux.x64-19.2…

Java的hashCode方法和equals方法

Java的hashCode方法和equals方法 简述 public native int hashCode()public boolean equals(Object obj) {return (this obj); }特性说明 返回对象的哈希值。支持此方法是为了使用哈希表&#xff0c;例如java.util.HashMap提供的哈希表。 hashCode的通用约定如下&#xff…

Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【三】

&#x1f600;前言 本篇博文是关于Spring Boot(Vue3ElementPlusAxiosMyBatisPlusSpring Boot 前后端分离)【三】的分享&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我…

keepalived+lvs(DR)

目录 一、作用 二、安装 1、在192.168.115.3 和192.168.115.4 上安装ipvs和keepalived&#xff1a; 2、配置keepalived 3、查看lvs节点状态 4、web节点配置 5、在web节点上调整ARP参数 6、配置虚拟IP地址与添加回环路由 7、配置nginx网页文档 8、启动服务 9、测试 一…

上位机采集8通道模拟量模块数据

模拟量模块和上位机的配合使用可以实现对模拟量数据的采集、传输和处理。下面是它们配合使用的一般步骤&#xff1a;1. 连接模拟量模块&#xff1a;将模拟量模块与上位机进行连接。这通常涉及将模拟量模块的输入通道与被监测的模拟信号源连接起来&#xff0c;如传感器、变送器等…

14. Docker中实现CI和CD

目录 1、前言 2、什么是CI/CD 3、部署Jenkins 3.1、下载Jenkins 3.2、启动Jenkins 3.3、访问Jenkins页面 4、Jenkins部署一个应用 5、Jenkins实现Docker应用的持续集成和部署 5.1、创建Dockerfile 5.2、集成Jenkins和Docker 6、小结 1、前言 持续集成(CI/CD)是一种…

18-使用钩子函数判断用户登录权限-登录前缀

钩子函数的两种应用: (1). 应用在app上 before_first_request before_request after_request teardown_request (2). 应用在蓝图上 before_app_first_request #只会在第一次请求执行,往后就不执行, (待定,此属性没调试通过) before_app_request # 每次请求都会执行一次(重点…

【Three.js + Vue 构建三维地球-Part One】

Three.js Vue 构建三维地球-Part One Vue 初始化部分Vue-cli 安装初始化 Vue 项目调整目录结构 Three.js 简介Three.js 安装与开始使用 实习的第一个任务是完成一个三维地球的首屏搭建&#xff0c;看了很多的案例&#xff0c;也尝试了用 Echarts 3D地球的模型进行构建&#xf…

设计模式中的关系

文章目录 一、依赖概念 二&#xff0c;关联概念 三、聚合概念 四、组合概念 五、实现概念 六、继承概念 图总结整体总结 一、依赖 概念 依赖是一种临时使用关系&#xff0c;代码层体现为作为参数。 具体体现&#xff1a;依赖者调用被依赖者的局部变量、参数、静态方法&#…

docker项目实战

目录 1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。 1&#xff09;拉取mysql:5.6和owncloud镜像 2&#xff09;后台运行容器 3&#xff09;通过ip:端口的方式访问owncloud 2、安装搭建私有仓库 Harbor 1&#xff09;首先准备所需包 2&#xff09;安装h…

Lua与C++交互(一)————堆栈

Lua与C交互&#xff08;一&#xff09;————堆栈 Lua虚拟机 什么是Lua虚拟机 Lua本身是用C语言实现的&#xff0c;它是跨平台语言&#xff0c;得益于它本身的Lua虚拟机。 虚拟机相对于物理机&#xff0c;借助于操作系统对物理机器&#xff08;CPU等硬件&#xff09;的一…

HTML番外篇(四)-HTML5新增元素-CSS常见函数-理解浏览器前缀-BFC

一、HTML5新增元素 1.HTML5语义化元素 在HMTL5之前&#xff0c;我们的网站分布层级通常包括哪些部分呢&#xff1f; header、nav、main、footer ◼ 但是这样做有一个弊端&#xff1a; 我们往往过多的使用div, 通过id或class来区分元素&#xff1b;对于浏览器来说这些元素不…

雅思作文复习

目录 我使用的词汇&#xff1a; 上升&#xff1a; 下降&#xff1a; 波动&#xff1a; 保持&#xff1a; 幅度 大变化&#xff1a; 小变化&#xff1a; 雅思评价标准改变 小作文一般花费20分钟&#xff0c;我觉得自己能在18分钟解决是最好 考生在雅思考试中的小作文&a…

嵌入式系统存储体系

一、存储系统概述 主要分为三种&#xff1a;高速缓存&#xff08;cache&#xff09;、主存和外存。 二、高速缓存Cache 高速缓冲存储器中存放的是当前使用得最多得程序代码和数据&#xff0c;即主存中部分内容的副本&#xff0c;其本身无自己的地址空间。在嵌入式系统中Cac…

配置DataX

配置DataX_3.0.0 1.配置DataX2.DataX案例 1.配置DataX 1&#xff09;下载DataX安装包并上传到hadoop102的/opt/software 下载地址&#xff1a;http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz .tar.gz到/opt/module [atguiguhadoop102 software]$ tar -zx…

别在说自己不知道docker了,全文通俗易懂的给你说明白docker的基础与底层原理

docker介绍 Docker 是一个开源的应用容器引擎&#xff0c;基于Go语言进行开发实现并遵从Apache2.0 协议开源&#xff0c;基于 Linux 内核的 cgroup&#xff0c;namespace&#xff0c;以及 OverlayFS 类的 Union FS 等技术&#xff0c;对进程进行封装隔离&#xff0c;属于 操作…

Redis.conf详解

Redis.conf详解 配置文件unit单位对大小写不敏感 包含 网络 bind 127.0.0.1 # 绑定的ip protected-mode yes # 保护模式 port 6379 # 端口设置通用 GENERAL daemonize yes # 以守护进程的方式运行 默认为no pidfile /var/run/redis_6379.pid #如果以后台的方式运行&#xff…

python+django+mysql旅游景点推荐系统-前后端分离(源码+文档)

系统主要采用Python开发技术和MySQL数据库开发技术以及基于OpenCV的图像识别。系统主要包括系统首页、个人中心、用户管理、景点信息管理、景点类型管理、景点门票管理、在线反馈、系统管理等功能&#xff0c;从而实现智能化的旅游景点推荐方式&#xff0c;提高旅游景点推荐的效…

javaee idea创建maven项目,使用el和jstl

如果使用el表达式出现下图问题 解决办法 这是因为maven创建项目时&#xff0c;web.xml头部声明默认是2.3&#xff0c;这个默认jsp关闭el表达式 办法1 在每个需要用到el和jstl的页面的上面加一句: <% page isELIgnored"false" %> 方法2 修改web.xml文件开…