栈和队列在数据结构中的应用

文章目录

      • 理解栈和队列的概念及其特点
      • 栈的应用和操作
      • 队列的应用和操作
      • 结论

在这里插入图片描述

🎉欢迎来到数据结构学习专栏~探索栈和队列在数据结构中的应用


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:数据结构学习
  • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
  • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

栈和队列是计算机科学中常见且重要的数据结构,它们在解决各种问题时发挥着重要作用。本文将深入探讨栈和队列的概念、特点,以及它们在实际编程中的广泛应用。

在这里插入图片描述

理解栈和队列的概念及其特点

栈: 栈是一种线性数据结构,其特点是遵循后进先出(Last In First Out,LIFO)原则。类比于餐厅叠盘子,只能从最上面取盘子,后放上去的盘子只有先取下来的时候才能再次访问。在计算机内部,栈采用类似的方式存储和管理数据。栈具有两个基本操作:压入(push)和弹出(pop)。例如,我们可以使用栈来实现撤销功能,将每一步的状态压入栈中,需要撤销时再弹出栈顶状态。

在这里插入图片描述

队列: 队列是另一种线性数据结构,其特点是遵循先进先出(First In First Out,FIFO)原则。想象一下排队买票,先来的人先被服务,后来的人需要等待。队列也有两个主要操作:入队(enqueue)和出队(dequeue)。队列在广度优先搜索、任务调度等领域具有重要应用。

栈的应用和操作

括号匹配: 括号匹配是栈的常见应用之一。我们可以使用栈来检查一个表达式中的括号是否匹配。遍历表达式,当遇到左括号时,将其压入栈中;当遇到右括号时,弹出栈顶的左括号,如果匹配则说明括号有效。以下是一个简单的括号匹配的示例代码:

在这里插入图片描述

public boolean isBracketValid(String expression) {
    Stack<Character> stack = new Stack<>();
    for (char ch : expression.toCharArray()) {
        if (ch == '(' || ch == '[' || ch == '{') {
            stack.push(ch);
        } else if (ch == ')' && !stack.isEmpty() && stack.peek() == '(') {
            stack.pop();
        } else if (ch == ']' && !stack.isEmpty() && stack.peek() == '[') {
            stack.pop();
        } else if (ch == '}' && !stack.isEmpty() && stack.peek() == '{') {
            stack.pop();
        } else {
            return false;
        }
    }
    return stack.isEmpty();
}

逆波兰表达式: 逆波兰表达式(后缀表达式)是一种数学表达式的表示方法,在计算中具有一定的优势。使用栈可以有效地计算逆波兰表达式。遍历表达式,遇到操作数时将其压入栈中,遇到操作符时弹出栈顶的操作数进行运算,并将结果重新压入栈中。以下是一个简单的逆波兰表达式求值的示例代码:

在这里插入图片描述

public int evaluateRPN(String[] tokens) {
    Stack<Integer> stack = new Stack<>();
    for (String token : tokens) {
        if (token.equals("+")) {
            int operand2 = stack.pop();
            int operand1 = stack.pop();
            stack.push(operand1 + operand2);
        } else if (token.equals("-")) {
            int operand2 = stack.pop();
            int operand1 = stack.pop();
            stack.push(operand1 - operand2);
        } else if (token.equals("*")) {
            int operand2 = stack.pop();
            int operand1 = stack.pop();
            stack.push(operand1 * operand2);
        } else if (token.equals("/")) {
            int operand2 = stack.pop();
            int operand1 = stack.pop();
            stack.push(operand1 / operand2);
        } else {
            stack.push(Integer.parseInt(token));
        }
    }
    return stack.pop();
}

队列的应用和操作

广度优先搜索: 广度优先搜索(Breadth First Search,BFS)是一种图算法,用于在图中搜索最短路径或者遍历所有节点。BFS从起始节点开始,逐层遍历,先访问与起始节点相邻的节点,然后再访问与这些节点相邻的节点。队列在BFS中扮演了重要角色,存储待访问的节点。

任务调度: 在操作系统和计算机网络中,队列常常用于实现任务调度。任务按照到达的先后顺序排队,每次从队列中取出一个任务进行执行。这种方式保证了任务的公平执行,避免了某些任务一直占用资源而导致其他任务无法执行的情况。

在这里插入图片描述

结论

栈和队列作为基本的数据结构,不仅在理论上有着重要地位,也在实际编程中有着广泛的应用。了解它们的特点、操作以及在不同领域中的应用,将为你在解决问题、优化程序效率等方面提供强有力的工具。通过实际的代码示例和应用场景,希望你对栈和队列有了更深入的理解,能够在编程实践中灵活运用。


🧸结尾


❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode--HOT100题(39)

目录 题目描述&#xff1a;101. 对称二叉树&#xff08;简单&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;101. 对称二叉树&#xff08;简单&#xff09; 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 LeetCode做题链接&#xff1a;LeetCode-…

Redis五种类型

Redis 基础类型 String 应用场景 缓存功能&#xff1a;string 最常用的就是缓存功能&#xff0c;会将一些更新不频繁但是查询频繁的数据缓存起来&#xff0c;以此来减轻 DB 的压力。 底层实现 如果字符串对象保存的是一个字符串值&#xff0c; 并且这个字符串值的长度大于…

idea切换Git分支时保存未提交的文件

解决方案 我们现在有三个分支&#xff0c;如下图&#xff1a; 我们目前在tenant分支上进行开发&#xff0c;需要去修复master的Bug&#xff0c;假设我们在tenant分支上修改了一个文件&#xff0c;如下图&#xff1a; 方法一&#xff1a;使用Shelve Changes 1、选中tenant上你不…

【linux】2 make/Makefile和gitee

文章目录 一、Linux项目自动化构建工具-make/Makefile1.1 背景1.2 实例代码1.3 原理1.4 项目清理 二、linux下第一个小程序-进度条2.1 行缓冲区2.2 进度条 三、git以及gitee总结 ヾ(๑╹◡╹)&#xff89;" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)&#xff89;" 一…

芯片行业震荡期,数字后端还可以入吗?

自去年开始&#xff0c;芯片行业仿佛进入了动荡期&#xff0c;经历了去年秋招和今年春招的小伙伴都知道&#xff0c;如今找工作有多难。 半导体行业人才缩减、各大厂裁员&#xff0c;在加上高校毕业生人数破千万&#xff0c;对于即将踏入IC这个行业的应届生来说&#xff0c;今…

华为星闪,一项将 “ 更稳 WiFi ” 和 “ 更好蓝牙 ” 融合起来的通信标准

兼顾多用途和专业化的 AI 大模型、移除安卓代码的 HarmonyOS NEXT 、给折叠屏应用提供适配方向的《 折叠屏/平板应用体验评估标准 》。。。 不过除了这些比较贴近我们普通用户&#xff0c;容易讲清楚的东西&#xff0c;华为还官宣了一个大家可能没注意的黑科技&#xff1a; 星…

【STM32RT-Thread零基础入门】 7. 线程创建应用(多线程运行机制)

硬件&#xff1a;STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线 文章目录 前言一、RT-Thread相关接口函数1. 获取当前运行的线程2. 设置调度器钩子函数 二、程序设计1. 头文件包含及宏定义2. 线程入口函数定义3. main函数设…

前端通信(渲染、http、缓存、异步、跨域)自用笔记

SSR/CSR&#xff1a;HTML拼接&#xff1f;网页源码&#xff1f;SEO/交互性 SSR &#xff08;server side render&#xff09;服务端渲染&#xff0c;是指由服务侧&#xff08;server side&#xff09;完成页面的DOM结构拼接&#xff0c;然后发送到浏览器&#xff0c;为其绑定状…

LLMs参考资料第一周以及BloombergGPT特定领域的训练 Domain-specific training: BloombergGPT

1. 第1周资源 以下是本周视频中讨论的研究论文的链接。您不需要理解这些论文中讨论的所有技术细节 - 您已经看到了您需要回答讲座视频中的测验的最重要的要点。 然而&#xff0c;如果您想更仔细地查看原始研究&#xff0c;您可以通过以下链接阅读这些论文和文章。 1.1 Trans…

无代码集成小鹅通连接多个应用

场景描述&#xff1a; 基于小鹅通云服务平台的开放API能力&#xff0c;零代码集成小鹅通连接多个应用。通过Aboter搭建自动化流程&#xff0c;实现多个应用之间的数据连接。 接口能力&#xff1a; 用户管理商品管理订单管理打卡管理直播管理物流管理积分管理作业管理考试管理…

GNU-gcc编译选项-1

include目录 -I &#xff0c;比如: -I. -I ./Platform/include -I ./Platform/include/prototypes -I ./tpm/include -I ./tpm/include/prototypes -I ./Simulator/include -I ./Simulator/include/prototypes 编译选项 在GCC编译器中&#xff0c;-D是一个编译选项&…

React Diff算法

文章目录 React Diff算法一、它的作用是什么&#xff1f;二、React的Diff算法1.了解一下什么是调和&#xff1f;2.react的diff算法3.React Diff的三大策略4.tree diff&#xff1a;1、如果DOM节点出现了跨层级操作&#xff0c;Diff会怎么办? 5. component diff&#xff1a;6. e…

element 下拉组件获取对象

// 选择数据user:[{name:"小白",id:1,money:"100",love:"蛋糕"},{name:"小黑",id:2,money:"200",love:"奶茶"},{name:"小红",id:3,money:"300",love:"烧烤"},] <div><el…

电商数据采集和数据分析

不管是做渠道价格的治理&#xff0c;还是做窜货、假货的打击&#xff0c;都需要品牌对线上数据尽数掌握&#xff0c;准确的数据是驱动服务的关键&#xff0c;所以做好电商数据的采集和分析非常重要。 当线上链接较多&#xff0c;品牌又需要监测线上数据时&#xff0c;单靠人工肯…

PySpark安装及WordCount实现(基于Ubuntu)

先盘点一下要安装哪些东西&#xff1a; VMwareubuntu 14.04&#xff08;64位&#xff09;Java环境&#xff08;JDK 1.8&#xff09;Hadoop 2.7.1Spark 2.4.0&#xff08;Local模式&#xff09;Pycharm &#xff08;一&#xff09;Ubuntu VMware 和 ubuntu 14.04&#xff08;…

spark第四课

countByValue 数据源中相同的值有多少个,也就是WordCount countByKey 表的是键值对中的key出现了几次,与Value的值无关 不推荐collect,因为他是将数据放入内存,但是内存不够大的话,就容易崩,所以使用saveAsTextFile更好,直接放入磁盘. 保存成对象文件,需要序列化 启动了2个 J…

设计模式之中介者模式(Mediator)的C++实现

1、中介者模式的提出 在软件组件开发过程中&#xff0c;如果存在多个对象&#xff0c;且这些对象之间存在的相互交互的情况不是一一对应的情况&#xff0c;这种功能组件间的对象引用关系比较复杂&#xff0c;耦合度较高。如果有一些新的需求变化&#xff0c;则不易扩展。中介者…

『论文精读』FastViT(ICCV 2023,Apple开源)论文解读

『论文精读』FastViT(ICCV 2023&#xff0c;Apple开源)论文解读 文章目录 一. FastViT简介二. 模型架构2.1. Stage 的内部架构2.2. Stem 的结构2.3. Patch Embedding 的架构2.4. 位置编码 三. 参考文献 论文下载链接&#xff1a;https://arxiv.org/pdf/2303.14189.pdf论文代码…

TCP的可靠性之道:确认重传和流量控制

TCP 全称为 Transmission Control Protocol&#xff08;传输控制协议&#xff09;&#xff0c;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;其中可靠性是相对于其他传输协议的优势点。TCP 为了确保数据传输的可靠性主要做了以下几点&#xff1a; 发送确…

Java云原生框架Quarkus初探

Java云原生框架Quarkus初探 Quarkus 介绍 Quarkus 是一个云原生&#xff0c;容器优先的Java应用框架&#xff0c;它号称是超音速和亚原子的框架&#xff0c;主要特点是构建速度、启动速度快和占用资源少等特点。它为OpenJDK HotSpot和GraalVM量身定制&#xff0c; 根据Java库和…