Day 25 C++ stack容器(栈)

news2024/11/24 13:17:23

文章目录

  • stack 基本概念
      • 定义
      • 基本概念
          • 栈顶(Top)——指向栈中最上面的元素的位置。
          • 入栈(Push)——将元素添加到栈顶。
          • 出栈(Pop)——从栈顶移除元素。
          • 栈空(Empty)——当栈中没有任何元素时,称为栈空。
          • 栈大小(Size)——表示栈中元素的数量。
  • stack 常用接口
      • 构造函数
      • 赋值操作
      • 数据存取
      • 大小操作
  • 示例
      • 代码
      • 分析
      • 总结
  • 常见的应用场景
      • 函数调用和递归
      • 表达式求值
      • 括号匹配
      • 浏览器的前进后退功能
      • 撤销操作
      • 在深度优先搜索(DFS)算法中,可以使用栈来实现对图或树的遍历。
      • 在迷宫求解问题中,可以使用栈来实现回溯算法。

stack 基本概念

定义

在C++中,栈(stack)是一种常见的数据结构,采用后进先出(Last-In-First-Out,LIFO)的原则。栈的特点是它只有一个出口,只允许在一端进行插入和删除操作,这一端被称为栈顶。在栈中,只有位于栈顶的元素可以被访问和操作,而其他元素则无法直接访问。栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为

请添加图片描述

基本概念

栈顶(Top)——指向栈中最上面的元素的位置。
入栈(Push)——将元素添加到栈顶。
出栈(Pop)——从栈顶移除元素。
栈空(Empty)——当栈中没有任何元素时,称为栈空。
栈大小(Size)——表示栈中元素的数量。

stack 常用接口

构造函数

  • stack<T> stk; stack采用模板类实现, stack对象的默认构造形式
  • stack(const stack &stk); 拷贝构造函数

赋值操作

  • stack& operator=(const stack &stk); 重载等号操作符

数据存取

  • push(elem); 向栈顶添加元素
  • pop(); 从栈顶移除第一个元素
  • top(); 返回栈顶元素

大小操作

  • empty(); 判断堆栈是否为空
  • size(); 返回栈的大小

示例

代码

#include <iostream>
#include <stack>

int main() {
    std::stack<int> stk;

    // 判断栈是否为空
    if (stk.empty()) {
        std::cout << "栈为空" << std::endl;
    }

    // 向栈中添加元素
    stk.push(10);
    stk.push(20);
    stk.push(30);

    // 返回栈顶元素
    std::cout << "栈顶元素为:" << stk.top() << std::endl;

    // 移除栈顶元素
    stk.pop();

    // 再次返回栈顶元素
    std::cout << "栈顶元素为:" << stk.top() << std::endl;

    // 获取栈的大小
    std::cout << "栈的大小为:" << stk.size() << std::endl;

    return 0;
}

运行结果如下:

栈为空
栈顶元素为:30
栈顶元素为:20
栈的大小为:2

分析

这个例子创建了一个整型的栈对象std::stack stk
然后通过empty()方法判断栈是否为空
接着使用push(elem)方法向栈中依次添加元素10、20和30。 使用top()方法可以获取栈顶元素的值
然后使用pop()方法移除栈顶元素
最后使用size()方法返回栈的大小。

总结

  • 入栈 — push
  • 出栈 — pop
  • 返回栈顶 — top
  • 判断栈是否为空 — empty
  • 返回栈大小 — size

常见的应用场景

函数调用和递归

在函数调用中,每当进入一个新的函数时,函数的调用信息(如返回地址、局部变量等)可以通过栈顶入栈,待函数执行完成后,这些信息会从栈顶依次出栈,实现了函数调用的递归和返回。

表达式求值

在一些需要解析表达式的场景中,可以使用栈来实现表达式的求值。例如,中缀表达式转换为后缀表达式,再利用栈对后缀表达式进行求值。

括号匹配

在处理括号匹配问题中,可以使用栈来验证括号是否配对。遇到左括号时,将其入栈;遇到右括号时,判断栈顶元素是否是对应的左括号,如果是,则将栈顶元素出栈,继续判断下一个字符;如果不是,说明括号不匹配。

浏览器的前进后退功能

在浏览器的前进后退功能中,可以使用两个栈来实现。一个栈用于存储用户访问的页面历史记录,另一个栈用于存储用户点击后退按钮时需要返回的页面历史记录。

撤销操作

在一些文本编辑器、绘图软件等应用中,可以使用栈来实现撤销操作。每当用户进行操作时,将操作的信息存储在栈中,在需要撤销操作时,从栈顶取出最近的操作信息进行回滚。

在深度优先搜索(DFS)算法中,可以使用栈来实现对图或树的遍历。

将起始节点入栈,然后循环执行以下步骤:从栈顶弹出一个节点,访问该节点,将其未访问过的邻居节点入栈。重复执行直到栈为空。

在迷宫求解问题中,可以使用栈来实现回溯算法。

将起始位置入栈,然后循环执行以下步骤:从栈顶弹出一个位置,尝试向上、下、左、右四个方向移动,如果可以移动则更新位置并入栈,直到找到目标位置或者栈为空。

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

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

相关文章

企业权限管理(三)-产品添加

产品添加 从product-list.jsp跳转到product-add.jsp <button type"button" class"btn btn-default" title"新建" onclick"location.href${pageContext.request.contextPath}/pages/product-add.jsp"><iclass"fa fa-file…

后端开发9.商品类型模块

概述 简介 商品类型我设计的复杂了点,设计了多级类型 效果图 数据库设计

ORACLE和MYSQL区别

1&#xff0c;Oracle没有offet,limit&#xff0c;在mysql中我们用它们来控制显示的行数&#xff0c;最多的是分页了。oracle要分页的话&#xff0c;要换成rownum。 2&#xff0c;oracle建表时&#xff0c;没有auto_increment&#xff0c;所有要想让表的一个字段自增&#xff0c…

(JS逆向专栏十三)某信平台网站登入SM2

声明: 本文章中所有内容仅供学习交流&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 名称:电信 目标:登入参数 加密类型:SM2 目标网址:https://login.189.cn/web/login …

推出全新TrenchStop™ 5 WR6系列,IKWH50N65WR6XKSA1、IKWH40N65WR6XKSA1带来更佳的系统可靠性(IGBT)

推出全新分立式封装的650V TRENCHSTOP 5 WR6系列&#xff0c;该系列采用TO-247-3-HCC封装&#xff0c;能够实现额定电流分别为20A、30A、40A、50A、60A和70 A的丰富产品组合&#xff0c;可轻松替换前代技术&#xff0c;如TRENCHSTOP 5 WR5、HighSpeed 3 H3技术。该系列针对家用…

Linux驱动之设备树添加蜂鸣器驱动

目录 一、蜂鸣器简介 二、硬件原理分析 三、蜂鸣器驱动原理 四、开发环境 五、修改设备树文件 1、添加 pinctrl 节点 2、添加 BEEP 设备节点 3、检查 PIN 是否被其他外设使用 六、蜂鸣器驱动程序编写 七、测试程序编写 八、运行验证 在 I.MX6U-ALPHA 开发板上有一个有源…

【揽睿星舟】艺术二维码完全生成攻略

导航栏 一、云端平台 1-1、云端平台的优势&#xff1a; 1-2、选择适合的云端平台需要考虑以下几个方面&#xff1a; 二、账号注册界面如下&#xff1a; 三、生成方法 3-1、图像到图像 3-1-1、二维码生成 3-1-2、选择云端平台来启动Stable Diffusion的Web UI 3-1-3、使用S…

记录--使用 JS 实现基本的截图功能

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 思路分析 在开始动手之前&#xff0c;分析一下整个功能的实现过程&#xff1a; 根据图片大小创建 canvas1 画布&#xff0c;并将原图片直接定位在 canvas1 上&#xff1b; 在画布上添加一个蒙层&…

MySQL插入数据库 insert into 语句 用法总结

目录 步骤 一、建表&#xff1a; 二、插入第一行数据 二、插入第二行数据&#xff08;指定要插入字段&#xff09; 三、插入第三行数据&#xff08;指定要插入的字段&#xff0c;但不是所有字段&#xff0c;除了(stu_id, stu_gender)&#xff09; 四、使用一条insert in…

maven中常见问题

文章目录 一、配置项提示二、父子打包三、打包之后不显示target四、自定义打包之后的jar包名称五、整个项目打包5.1、父项目管理插件和微服务打包 一、配置项提示 SpringBoot中提示错误信息 表示的是SpringBoot中的注释提示没有配置&#xff01;那么可以来使用一下springboot官…

【VS Code插件开发】通用功能(二)

&#x1f431; 个人主页&#xff1a;不叫猫先生&#xff0c;公众号&#xff1a;前端舵手 &#x1f64b;‍♂️ 作者简介&#xff1a;2022年度博客之星前端领域TOP 2&#xff0c;前端领域优质作者、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步…

红帽8.2版本CSA题库:第六题创建协作目录权限

红帽认证工程师第六题创建协作目录权限 mkdir /home/managers chown :sysmgrs /home/managers chmod 2770 /home/managers 测试&#xff1a; touch /home/managers/12345 ll /home/managers/12345

【雕爷学编程】Arduino动手做(04)---震动传感器模块5

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

Windows和Linux系统上的矢量运算:指令级并行计算SIMD(SSE/VAX)

注&#xff1a;本文的SIMD&#xff0c;指的是CPU指令架构中的相关概念。不涉及GPU端的算力机制。 基本概念 SIMD&#xff0c;Single Instruction/Multiple Data&#xff0c; 即单指流令多数据流&#xff0c;例如一个乘法指令&#xff0c;可以并行的计算8个浮点数的乘法。 SIM…

【Minecraft】Fabric Mod开发完整流程1 - 环境配置与第一个物品

前言 Fabric 是 Minecraft 一款非官方的模组 API,与 Forge mod 不同。它以轻量级和高性能为设计目标,专注于支持新版本的 Minecraft。 Fabric 和 Forge 在各自的加载编译流程上差别很大&#xff0c;所以你很难看见有同时支持二者的 mod&#xff0c;除非做了兼容性处理 Fabri…

新型高速 JavaScript 运行时 Bun 0.7 发布

导读近日&#xff0c;新型 JavaScript 运行时 Bun 正式发布了 0.7 版本&#xff0c;带来了重大的升级。据悉&#xff0c;Bun 是一个配套齐全的 JavaScript 解决方案&#xff0c;集运行时、打包器、转译器和包管理器于一体&#xff0c;追求极致的运行速度。此次更新主要集中在与…

命令提示符之操作基础(Windows)

打开命令提示符 方法一 打开指定文件的文件夹&#xff0c;在路径栏里输入“cmd”&#xff0c;回车&#xff0c;就进入控制台了。默认路径就是指定文件夹的路径。 方法二 打开指定的文件夹&#xff0c;按住shift键&#xff0c;在空白处右击&#xff0c;在菜单栏中选择“在此处打…

基于nodejs+vue+uniapp微信小程序的短视频分享系统

开发语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode 3.1小程序端 用户注册页面&#xff0c;输入用户的个人信息点击注册即可。 注册完成后会返回到登录页面&#xff0c;用户输入自己注…

液态金属——究竟是个美丽的概念还是大有可为

液态金属是一种新型的合金材料&#xff0c;在低温熔炼制备工艺下&#xff0c;将不同的金属材料按照一定的配比&#xff0c;通过温度控制使其充分融合&#xff0c;从而形成新的金属材料&#xff08;也可以理解为表面工艺处理手法&#xff09;。 液态金属可看作由正离子流体和自由…

electron+vue3全家桶+vite项目搭建【13.1】ipc通信的使用,主进程与渲染进程之间的交互

文章目录 引入IPC通信[主/渲染]进程对应渲染进程>主进程代码测试测试效果 主进程>渲染进程代码测试测试效果 双向通信代码测试测试效果 引入 electron项目常常由一个主进程和多个渲染进程构成&#xff0c;渲染进程之间是隔离的&#xff0c;而所有渲染进程都和主进程共享…