理解栈(Stack)及其在 C++ 中的应用【栈、数据结构】

news2024/9/27 7:25:01

在这篇博客中,我们将详细介绍栈(Stack)这一重要的数据结构,包括其基本概念、常用操作、C++ 中的实现,以及一些实际应用。

什么是栈?

栈是一种数据结构,它遵循“后进先出”(LIFO - Last In, First Out)的原则。栈就像是一叠盘子,你只能从最上面拿盘子,也只能在最上面放盘子。栈的这一特性使其在很多场景中非常有用,例如递归、回溯算法和表达式计算等。

栈的常用操作

在 C++ 中,我们通常使用 std::stack(定义在 <stack> 头文件中)来实现栈。以下是一些常用操作:

1. 创建栈

#include <stack>
#include <iostream>

std::stack<int> myStack;

这行代码创建了一个存储整数类型的栈。

2. push 操作

将元素添加到栈的顶部。

myStack.push(10);
myStack.push(20);
myStack.push(30);

这几行代码将元素 102030 依次推入栈中,其真实存储结构如下:
在这里插入图片描述

3. top 操作

访问栈顶部的元素,但不移除它。

std::cout << "Top element: " << myStack.top() << std::endl;

这行代码访问栈顶元素,结果为 30

4. pop 操作

移除栈顶部的元素。

myStack.pop();

这行代码移除栈顶元素。

5. size 操作

返回栈中的元素个数。

std::cout << "Stack size: " << myStack.size() << std::endl;

这行代码输出栈的大小,结果为 3

6. empty 操作

检查栈是否为空。

if (myStack.empty()) {
    std::cout << "Stack is empty" << std::endl;
} else {
    std::cout << "Stack is not empty" << std::endl;
}

这段代码检查栈是否为空,并输出结果。

栈的实际应用

1. 将 stack<char> 转换为字符串

有时我们可能需要将栈中的字符转换为字符串。我们可以通过弹出栈中的元素并将它们连接起来实现这一点。

特别需要注意的是:因为栈的先进后出(LIFO)性质,所以很多时候我们从前往后遍历的时候,在最后输出结果的时候需要 reverse 一下。

#include <stack>
#include <string>
#include <iostream>
#include <algorithm> // for std::reverse

std::string stackToString(std::stack<char> &charStack) {
    std::string result;
    while (!charStack.empty()) {
        result += charStack.top();
        charStack.pop();
    }
    // 反转结果以获得正确的顺序
    std::reverse(result.begin(), result.end()); 
    return result;
}

int main() {
    std::stack<char> charStack;
    charStack.push('a');
    charStack.push('b');
    charStack.push('c');

    std::string result = stackToString(charStack);
    std::cout << "Stack to string: " << result << std::endl; // 输出 "abc"

    return 0;
}

2. 括号匹配问题

括号匹配是栈的经典应用之一。我们可以使用栈来检查一个字符串中的括号是否匹配。

#include <stack>
#include <string>
#include <iostream>

bool isValid(std::string s) {
    std::stack<char> stack;
    for (char c : s) {
        if (c == '(' || c == '[' || c == '{') {
            stack.push(c);
        } else {
            if (stack.empty()) return false;
            char top = stack.top();
            if ((c == ')' && top != '(') || 
                (c == ']' && top != '[') || 
                (c == '}' && top != '{')) {
                return false;
            }
            stack.pop();
        }
    }
    return stack.empty();
}

int main() {
    std::string s = "{[()]}";
    if (isValid(s)) {
        std::cout << "Valid brackets" << std::endl;
    } else {
        std::cout << "Invalid brackets" << std::endl;
    }

    return 0;
}

在这段代码中,我们使用栈来处理括号匹配问题。遍历字符串,如果是左括号就压入栈中,如果是右括号则检查栈顶是否为匹配的左括号。如果匹配则弹出栈顶,否则返回 false。最后如果栈为空则括号匹配成功。

总结

通过这篇博客,我们详细介绍了栈的基本概念及其在 C++ 中的实现。栈是一种非常有用的数据结构,尤其在处理递归、回溯和表达式计算等问题时。我们还讨论了如何将栈中的字符转换为字符串,以及如何使用栈解决括号匹配问题。

特别需要注意的是,栈的先进后出(LIFO)性质在很多应用场景中都需要我们进行结果的反转,以确保顺序正确。希望这篇博客能够帮助你更好地理解栈的使用及其在实际问题中的应用。

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

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

相关文章

上海AI Lab 搭台,36个大模型一起角逐长上下文建模能力

现在的大模型论文简直像是在比长度&#xff0c;动不动就上百页&#xff01;记得前阵子小编瞅见那份90页的Gemini技术报告&#xff0c;顿时脑袋嗡嗡作响。那会儿就幻想着&#xff1a;要是有个AI大脑来啃下这些"学术巨无霸"&#xff0c;那岂不是爽歪歪&#xff1f; 没…

SpringDoc:一个用于自动生成API文档的工具

SpringDoc的使用 概述SpringDoc添加依赖配置 Springdoc创建 REST 控制器访问 API 文档添加注释和描述自定义配置常用注解 详细示例创建模型类创建REST控制器查看Swagger UI与OpenAPI 安全策略类型概述HTTPAPIKEYOAUTH2OPENIDCONNECTMUTUALTLS 请求头配置认证token代码实现验证 …

C++:C++11介绍

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一、C11简介 二 统一的列表初始化 2.1 {} 初始化 2.2 std::initializer_list 三 声明 3.1 auto 3.2 decltype 3.3 nullptr 四 范围for循环 五 智能指针 六 STL中一些变化…

瑞_RabbitMQ_初识MQ

文章目录 1 初识MQ1.1 同步调用1.1.1 同步调用的优势1.1.2 同步调用的缺点 1.2 异步调用1.2.1 异步调用的角色1.2.2 异步调用的优势1.2.3 异步调用的缺点1.2.4 异步调用的场景 1.3 MQ技术选型 2 RabbitMQ2.1 安装2.1.1 资源准备2.1.2 安装步骤 2.2 RabbitMQ架构2.3 RabbitMQ管理…

Starrocks解析json数组

json数据 [{"spec": "70g/支","unit": "支","skuId": "1707823848651276346","amount": 6,"weight": 70,"spuName": "伊利 甄稀 苦咖啡味雪糕 流心冰淇淋 70g/支",&quo…

你不知道,PMP证书的含金量究竟有多高

PMP考试的含金量体现在其全球认可度、对职业发展的助力、薪资潜力的提升、系统的知识体系、持续学习的要求以及专业网络的建设等方面。 尽管存在一定的维护成本和市场饱和度问题&#xff0c;PMP认证仍然是项目管理领域内备受推崇的资格证书。 对于追求专业发展和提升项目管理…

【安卓】发送自定义广播

文章目录 发送标准广播发送有序广播 发送标准广播 先定义一个BroadcastReceiver来准备接收广播&#xff0c;新建一个MyBroadcastReceiver。 public class MyBroadcastReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, Intent intent) {To…

惊爆!OpenAI 高层发生剧烈动荡!竟然有 3 名元老同时离职,同时,马斯克竟起诉奥特曼“敲诈勒索”, GPT-5 要推迟了?

当今之 OpenAI 可谓是事端频出&#xff0c;波澜迭起。 开端之际&#xff0c;马斯克竟对 OpenAI提起诉讼&#xff0c;随后&#xff0c;重要的元老级高管公开宣告离职&#xff0c;而且还被披露高管领导层内部动荡不安&#xff0c;最终&#xff0c;就连原本定于年底发布的 GPT-5 …

【JVM基础15】——实践-JVM参数可以在哪里设置

目录 1- 引言&#xff1a;2- ⭐核心&#xff1a;2-1 Tomcat 设置 JVM 参数2-2 Jar包设置 JVM 参数 3- 小结&#xff1a;3-1 JVM参数可以在哪里设置 1- 引言&#xff1a; 一般这种问题是涉及到项目部署时候的参数设置&#xff0c;一般的部署方式 war 包部署在 tomcat 中设置jar…

MySQL第5讲--DML(数据操作语言)的基本操作

文章目录 前言DML(数据操作语言)基本操作增加数据案例展示修改数据案例展示删除数据 DML总结 前言 在第四讲MySQL第4讲–图像化界面工具DataGrip介绍中我们讲述了数据库的可视化操作界面&#xff1b;今天我们讲一下数据库中DML(数据操作语言)的基本操作&#xff1b; DML(数据操…

灵办AI:智能插件,办公与编程的得力助手

目录 引言一、灵办AI&#xff1a;智能化的办公伙伴二、编程能力&#xff1a;&#x1f525;代码阅读&#xff0c;学习助手&#x1f525;1、代码解读2、代码续写3、代码优化 三、插件端对话功能&#xff1a;智能交互&#xff0c;流畅体验四、翻译功能&#xff1a;一键翻译&#x…

JAVA毕业设计158—基于Java+Springboot的二手车交易管理系统(源代码+数据库+万字论文+ppt)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringboot的二手车交易管理系统(源代码数据库万字论文ppt)158 一、系统介绍 本项目前后端不分离(可以改为ssm版本)&#xff0c;分为用户、管理员两种角色 1、用户&#…

AT32F421专题---SPI连接CH395Q以太网芯片

【啰嗦2句】 写作不是我主业&#xff0c;所以写得少&#xff0c;但是尽可能给满是雷同知识海洋里面添加一点独特的元素。 本文是AT32F421C8T7芯片跟以太网芯片CH395Q的SPI对接与驱动。因部分属于商业内容&#xff0c;不便于公开&#xff0c;但也会把核心需要注意的内容讲出来。…

Windows环境下PCL配置错误 can not be found on this machine

Windows环境下PCL配置错误 can not be found on this machine windows系统下pcl安装参考&#xff1a; https://blog.csdn.net/knighthood2001/article/details/139197693?ops_request_misc&request_id&biz_id102&utm_termwindows%20pcl&utm_mediumdistribute.…

某MDM主数据管理系统与微软Dynamic CRM系统(新加坡节点)集成案例

一、项目背景 某客户需要将物料和配件等主数据和海外系统进行对接&#xff0c;由SAP PO在中间对接海外系统&#xff0c;进行主数据的下发&#xff0c;方便两端系统之间进行对接&#xff0c;集团统一性管理国内海外数据&#xff0c;提高整体业务效率&#xff0c;保证数据的时…

c++的类和对象(上)

前言 Hello,小伙伴们&#xff0c;今天我们将开启一个新的章节&#xff0c;一起来探寻c的奥秘。 好&#xff0c;废话不多说我们我们现在开始我们今天的学习&#xff01;&#xff01; 1.类的定义 1.1类的定义格式 c为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{…

【Python】requests的response.text 和 urllib.request 的 response.read()的区别

刚写代码的时候&#xff0c;我经常会把requests 和 urllib下的request 包搞混&#xff0c;这两个请求响应的方法看起来很相似&#xff0c;但是写获取的方法是不一样的。 前者requests 是用response.text 来获取源码&#xff0c;而 urllib.request是用 response.read() 来获取h…

Visual Studio Code搭建VUE开发环境

Vue.js 是一款易学易用&#xff0c;性能出色&#xff0c;适用场景丰富的 Web 前端框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;提供容易上手的 API 和一流的文档。可以用来开启PC网页、移动端网页页面、小程序等等 实验环境 VS Code 1.88.1Node 20.16.0Vue3.2…

社交及时通讯平台完整版源码,uniapp技术,可打包成app

源码简介&#xff1a; 全原生&#xff0c;从底层开始结构就完全不一样&#xff0c;mongodb的库&#xff0c;uniapp混编手端&#xff0c;二开难度要比视酷或者酷信容易很多。全开源&#xff0c;带开发文档。前端用的是uniapp技术&#xff0c;所以是多端合一&#xff0c;可以做h…