LeetCode 算法:有效的括号 c++
原题链接🔗:有效的括号
难度:简单⭐️
题目
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
提示:
- 1 <= s.length <= 104
- s 仅由括号 ‘()[]{}’ 组成
栈
数据结构中的栈(Stack)是一种遵循后进先出(Last In First Out,LIFO)原则的线性数据结构。在栈中,数据的添加和删除都发生在栈顶。栈的两个主要操作是:
- 压栈(Push):将一个元素添加到栈顶。
- 弹栈(Pop):移除栈顶的元素,并返回它。
此外,栈还可能支持以下操作:
- 查看栈顶元素(Peek/Top):返回栈顶元素,但不从栈中移除它。
- 检查栈是否为空(IsEmpty):判断栈是否没有任何元素。
- 获取栈的大小(Size):返回栈中元素的数量。
栈在计算机科学中有着广泛的应用,例如:
- 函数调用和返回的实现:每次函数调用时,其返回地址和局部变量会被压入调用栈。
- 括号匹配问题:使用栈来检查字符串中的括号是否正确闭合。
- 撤销操作(Undo):在编辑器或绘图软件中,用户的操作可以被压入栈中,以便随时撤销。
- 深度优先搜索(DFS):在图或树的遍历中,使用栈来存储待访问的节点。
栈的实现可以基于数组或链表。数组实现的栈具有固定的大小,而链表实现的栈则可以动态地增长和收缩。
栈的 C++ 实现示例
以下是使用 C++ 标准模板库(STL)中的 std::stack 容器实现栈的一个简单示例:
#include <iostream>
#include <stack>int main() {std::stack<int> myStack;// 压栈操作myStack.push(10);myStack.push(20);myStack.push(30);// 查看栈顶元素std::cout << "Top element is: " << myStack.top() << std::endl;// 弹栈操作myStack.pop();std::cout << "Top element after one pop is: " << myStack.top() << std::endl;// 检查栈是否为空if (!myStack.empty()) {std::cout << "Stack is not empty." << std::endl;}// 获取栈的大小std::cout << "Size of stack: " << myStack.size() << std::endl;return 0;
}
这个示例展示了如何创建一个整数类型的栈,执行压栈和弹栈操作,查看栈顶元素,检查栈是否为空,以及获取栈的大小。
题解
- 解题思路:
LeetCode 上的 “有效的括号”(Valid Parentheses)问题是一个经典的栈(Stack)应用问题。这个问题要求判断一个字符串中的括号是否正确配对。
问题描述: 给定一个字符串 s,判断它是否是有效的括号序列。有效的括号序列需要满足以下条件:
- 左括号必须有对应的右括号与之配对。
- 括号必须按照正确的顺序配对。
括号包括圆括号 ()、方括号 [] 和花括号 {}。
解题思路 :
- 使用栈结构:栈是一种后进先出(LIFO)的数据结构,非常适合处理配对问题。
- 遍历字符串:逐个字符遍历字符串 s。
- 遇到左括号:如果是左括号((, [, {),则将其推入栈中。
- 遇到右括号:如果是右括号(), ], }):
- 检查栈顶是否有对应的左括号:
- 如果栈为空或者栈顶元素与当前右括号不匹配,说明括号序列无效,返回 False。
- 如果匹配,将栈顶元素弹出。
- 遍历结束:遍历完成后,检查栈是否为空:
- 如果栈为空,说明所有括号都正确配对,返回 True。
- 如果栈不为空,说明有未配对的左括号,返回 False。
- c++ demo:
#include <iostream>
#include <stack>
#include <string>
#include <map>using namespace std;class Solution {
public:bool isValid(string s) {stack<char> st;// 定义括号的映射关系map<char, char> brackets = { {')', '('}, {']', '['}, {'}', '{'} };for (char c : s) {if (c == '(' || c == '[' || c == '{') {// 如果是左括号,压入栈中st.push(c);}else {// 如果栈为空或者栈顶元素与当前右括号不匹配,返回falseif (st.empty() || brackets[c] != st.top()) {return false;}// 匹配则弹出栈顶元素st.pop();}}// 如果栈为空,则所有括号都正确配对return st.empty();}
};int main() {Solution solution;// 测试用例string test1 = "()";string test2 = "()[]{}";string test3 = "(]";string test4 = "([)]";string test5 = "{[()]}()";// 执行测试并打印结果cout << "Test 1: " << (solution.isValid(test1) ? "True" : "False") << endl;cout << "Test 2: " << (solution.isValid(test2) ? "True" : "False") << endl;cout << "Test 3: " << (solution.isValid(test3) ? "True" : "False") << endl;cout << "Test 4: " << (solution.isValid(test4) ? "True" : "False") << endl;cout << "Test 5: " << (solution.isValid(test5) ? "True" : "False") << endl;return 0;
}
- 输出结果:
Test 1: True
Test 2: True
Test 3: False
Test 4: False
Test 5: True
- 代码仓库地址:isValid
相关文章:
LeetCode 算法:有效的括号 c++
原题链接🔗:有效的括号 难度:简单⭐️ 题目 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: …...
react和vue的diff算法的差别
React 的 Diff 算法 React 的 diff 算法主要基于以下几个原则: 同层比较: React 只会比较同一层级的节点,不会跨层级比较。假设跨层级的变化较少,从而简化了算法,提高了性能。 深度优先遍历: React 采用深…...
算法【滑动窗口】
滑动窗口指的是维持左、右边界都不回退的一段范围,来求解很多子数组(串)的相关问题。 滑动窗口的关键是找到范围和答案指标之间的单调性关系(类似贪心)。 滑动过程:滑动窗口可以用简单变量或者结构来维护…...
【RISC-V设计-06】- RISC-V处理器设计K0A之ALU
【RISC-V设计-06】- RISC-V处理器设计K0A之ALU 文章目录 【RISC-V设计-06】- RISC-V处理器设计K0A之ALU1.简介2.顶层设计3.内部结构4.端口说明5.操作码说明6.设计代码7.总结 1.简介 算术逻辑单元(Arithmetic Logic Unit,简称 ALU)是计算机中…...
MyIP:强大且简单好用!
在这个数字化的时代,IP地址就像是我们的网络身份证。各位在日常的工作中,肯定会会遇到需要和 IP 地址相关的需求。 今天和大家聊一聊一个非常好用的开源 IP 工具项目 - MyIP。 简介 MyIP一个开源IP工具箱,提供了一系列的网络检测工具&…...
Redis作为缓存,如何与MySql的数据进行同步?
允许延时一致的业务 概念 采用异步通知使用MQ作为中间件,更新数据之后通知缓存删除利用canal中间件,不需要修改业务代码,伪装成Mysql的一个从节点,canal通过读取binlog数据更新缓存 强一致性业务 概念 采用Redission提供的读写锁…...
Android 通知栏推送功能
Android 通知栏推送功能 Android 通知栏推送功能 让消息在用户的通知栏上显示,并且点击后跳转到指定的页面 MainActivity.Java import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import andro…...
【LVS】防火墙mark标记解决调度问题
实验环境是在之前部署DR模式集群的基础上做的,参考如下 部署DR模式集群 以http和https为例,当我们在webserver中同时开放80和443端口,那么默认控制是分开轮询的,就会出现了一个轮询错乱的问题: 当第一次访问80被轮询…...
算法笔记|Day20回溯算法II
算法笔记|Day20回溯算法II ☆☆☆☆☆leetcode 39. 组合总和题目分析代码 ☆☆☆☆☆leetcode 40.组合总和II题目分析代码 ☆☆☆☆☆leetcode 131.分割回文串题目分析代码 ☆☆☆☆☆leetcode 39. 组合总和 题目链接:leetcode 39. 组合总和 题目分析 本题采用回…...
Oracle认证1Z0-071线上考试注意事项
目录 一、前言二、回顾过往战绩第一次 裸考🐒第二次 背题库硬考!🐒第三次 软件卡住,寄!🙈第四次 汇总纠错,通过!🌚 三、考试流程四、考试注意事项1. 是否需要科学上网2. …...
【C++ 面试 - 基础题】每日 3 题(八)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…...
影响LabVIEW工作效率的因素有哪些
影响LabVIEW工作效率的因素可以分为多个方面,涵盖硬件、软件、开发环境和编程习惯等。以下是一些常见的影响因素: 1. 硬件因素 处理器性能:处理器的速度和核心数量对LabVIEW程序的执行效率有很大影响。 内存大小:足够的内存可以保…...
linux 裸机.之SPV5210,dnw,usb,sdk,fastboot刷机(一)
linux 裸机.之SPV5210,dnw,usb,sdk,fastboot刷机(一)...
性能测试工具LoadRunner
前言👀~ 上一章我们介绍了性能测试的一些基本概念,重要的是性能测试的各项指标,今天我们使用性能测试工具LoadRunner简单的完成一次性能测试 性能测试Load Runner LoadRunner是什么? LoadRunner安装 LoadRunner脚本录制 1.录…...
智能归来:深入探索人工智能回归模型的奥秘
人工智能之回归模型 1. 回归模型的数学基础1.1 回归分析的基本原理1.1.1 目标变量与预测变量的关系1.1.2 线性回归模型 1.2 矩阵形式的回归模型1.2.1 回归方程的矩阵表示1.2.2 矩阵运算的基本性质及其在回归分析中的应用 1.3 总结 2. 最小二乘法 (Ordinary Least Squares, OLS)…...
swift 中,对象() 和 对象.init() 的共同点和异同点
在阅读同事的代码时,不同人对对象的初始化方式是不一样的,例如存在一个对象AController, 有些人创建的方式如下: let controller AController()也有人创建的方式如下: let controller AController.init()下面来说明一下&#…...
Google安装JSON-handle扩展
JSON-hande下载地址: JSON-Handle 官网 - 打开json格式文件的浏览编辑器 1. 重命名扩展文件(crx)后缀 为 zip。 2. 解压zip成文件夹,保存到指定目录。 3. Google浏览器地址栏输入 “chrome://extensions/”回车。然后开启 开发者模式。 4. 点击“加载…...
剖析算法内部结构----------贪心算法
什么是贪心算法? 贪心算法(Greedy Algorithm)是一种在问题求解过程中,每一步都采取当前状态下最优(即最有利)的选择,从而希望导致最终的全局最优解的算法策略。 贪心算法的核心思想是做选择时&…...
uni-app开发微信小程序注意事项,不要用element-ui
前端扩展组件千万不要用element-ui,开发的时候不报错,发布的时候会报错无法发布。 可以用vant weapp【注意是weapp】 iView weapp 附上hbuilder官方文档 组件的概念 | uni-app官网 (dcloud.net.cn)...
Hibernate的检索策略(lazy、fetch、batch-size)
Hibernate的检索策略包括立即检索和延迟检索,可以在配置文件中通过对lazy、fetch、batch-size属性的设置来进行控制。一对多、多对多、多对一和一对一关系下的不同检索策略将影响对数据库访问的效率。 检索策略 立即检索,立即加载检索方法指定的对象延…...
jsp:forward登录验证的学习与总结
一、学习内容 本次作业完成了基于 JSP 的用户登录功能开发,核心掌握了以下知识点: 1. JSP 表单提交与参数获取:通过 request.getParameter 读取前端输入值; 2. 页面跳转实现:区分请求转发(jsp:forward&…...
Embedded Coder实战:5分钟搞定PID控制器的C代码生成(附完整配置流程)
Embedded Coder实战:5分钟搞定PID控制器的C代码生成(附完整配置流程) 在工业自动化领域,PID控制器就像一位不知疲倦的调节大师,默默维持着无数设备的稳定运行。想象一下,当你需要将这套经典算法部署到资源有…...
dumper.js性能优化:大型对象检查的10个实用技巧
dumper.js性能优化:大型对象检查的10个实用技巧 【免费下载链接】dumper.js A better and pretty variable inspector for your Node.js applications 项目地址: https://gitcode.com/gh_mirrors/du/dumper.js dumper.js是一款为Node.js应用打造的变量检查工…...
工具使用指南:提升效率的关键方法与实践
在信息爆炸的今天,我们接触到的数字工具数量呈指数级增长。从文档处理到图像编辑,从项目管理到团队协作,各类工具层出不穷。然而,一个普遍现象是:许多人工具越装越多,效率却并未显著提升。问题的根源往往不…...
Logisim实战:从零构建学号音乐盒的数字系统设计
1. Logisim与数字系统设计入门 第一次打开Logisim时,我盯着满屏的逻辑门和导线有点发懵。这个看起来像电路板绘图工具的家伙,真能做出会唱歌的音乐盒?经过两周的折腾,我不仅用学号显示音乐播放的完整系统交上了课程作业࿰…...
搞电机控制的兄弟应该都懂,无感算法里磁链观测器+PLL锁相环的组合有多香。今天直接上干货,聊聊非线性磁链观测器的实现套路和实操中那些让你少掉几根头发的技巧
永磁同步电机非线性磁链无感算法、Flux观测器锁相环PLL仿真模型 flux:计算电机磁链,目的为了使得估计的磁链收敛于实际磁链; pll:通过估计磁链计算经过pi调节后使得估计角度跟踪实际角度 模型描述及资料: (…...
OpenClaw性能优化:降低千问3.5-9B调用的Token消耗
OpenClaw性能优化:降低千问3.5-9B调用的Token消耗 1. 为什么需要关注Token消耗 去年冬天我第一次用OpenClaw对接千问3.5-9B模型时,被账单吓了一跳——一个简单的文件整理任务竟然消耗了将近2万Token。这让我意识到,在本地部署场景下&#x…...
OpenClaw+千问3.5-9B自动化测试:自然语言描述生成单元测试用例
OpenClaw千问3.5-9B自动化测试:自然语言描述生成单元测试用例 1. 为什么需要自然语言生成测试用例 作为一名长期奋战在代码一线的开发者,我深知单元测试的重要性,但编写测试用例往往比实现功能本身更耗时。特别是在快速迭代的项目中&#x…...
2025届学术党必备的六大AI辅助写作网站横评
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能于学术论文写作里的应用愈发广泛,其核心价值展现成高效文献检索、结构化…...
【数据结构】二叉树非递归前中后序遍历详解
二叉树的遍历是二叉树操作的基础核心,递归遍历实现简单但存在栈溢出风险,在处理深度较大的二叉树时,非递归遍历凭借手动维护栈的方式更具稳定性。本文将详细讲解二叉树前序、中序、后序的非递归遍历实现思路,结合 C 语言代码完整实…...
