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

server/2024/9/24 23:23:53/

在这篇博客中,我们将详细介绍(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::reversestd::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.ppmy.cn/server/99706.html

相关文章

Perl套接字编程指南:构建网络通信应用

摘要 Perl是一种功能强大的脚本语言&#xff0c;广泛应用于系统管理、网络编程等多种场景。Perl的套接字编程能力允许开发者创建客户端和服务器端的网络应用。本文将详细介绍Perl中套接字的使用&#xff0c;包括基础概念、API的使用&#xff0c;以及构建简单客户端和服务器的示…

SpringCloud-gateway编码实现路由策略的自动刷新,动态路由

文章目录 一、概述1、背景2、实现思路 二、编码实现1、nacos配置刷新公共类2、自定义RouteDefinition3、route缓存类4、动态更新路由网关service5、动态路由加载类 三、测试 一、概述 1、背景 gateway可以配置路由断言过滤器&#xff0c;但是通常一个微服务体系下&#xff0c…

电脑管家软件搬运导致edge、chrome浏览器不可用

最新版本的腾讯电脑管家可以直接搬运软件到其他路径&#xff0c;但是搬运浏览器会造成软件问题&#xff0c;不建议搬运。 浏览器恢复到原路径&#xff0c;可以解决浏览器不可用的问题&#xff1a; 首先到达你的搬运路径下 可以看到软件文件夹&#xff0c;比如Microsoft Edge或…

vue 打包时候的分包

export default defineConfig({plugins: [vue()],resolve: {alias: {: fileURLToPath(new URL(./src/, import.meta.url))}},// 分包&#xff0c;node_modules中的单独打包成名字为vendor的js文件build: {rollupOptions: {manualChunks(id) {if (id.includes(node_modules)) {r…

AWS中的 CloudFormation

AWS中的 CloudFormation 1. CloudFormation 是什么&#xff1f; AWS CloudFormation 是亚马逊科技&#xff08;AWS&#xff09;提供的一项服务&#xff0c;允许用户通过模板来描述和配置&#xff0c;从而实现基础设施即代码&#xff08;Infrastructure as Code&#xff0c;la…

Prometheus 监控指标采集

原文链接&#xff1a;https://www.hezebin.com/article/66b3b1fb4379b36dec11a1a1 前言 在现代分布式系统和云原生环境中&#xff0c;为了确保复杂的分布式系统和服务的高可用性、可靠性和性能&#xff0c;通常采用实时可视化监控和分析&#xff0c;实现故障快速响应、资源优…

oracle 判断某个字段包含某几个字符like或INSTR

在Oracle数据库中&#xff0c;如果你想判断某个字段是否包含某几个字符&#xff08;字符序列&#xff09;&#xff0c;你可以使用LIKE操作符或者INSTR函数。选择哪一个取决于你的具体需求&#xff0c;比如是否需要对位置敏感或者是否需要在模式匹配中使用通配符。 使用LIKE操作…

STM32的SDIO接口详解

目录 1. 定义与兼容性 2. SDIO时钟 3. SDIO命令与响应 4. SDIO块数据传输 5. SDIO控制器的硬件结构 6.代码实现 1.SD初始化 2.测试SD卡的读取 3.测试SD卡的写入 STM32的SDIO&#xff08;Secure Digital Input/Output&#xff0c;安全数字输入输出&#xff09;接口是一…