当前位置: 首页 > news >正文

堆栈面试题之有效的括号

题目描述

给定一个只包 '('')''{''}''['']' 的字符串,判断字符串是否有效。

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。

注意:空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true

示例 2:

输入: "()[]{}"
输出: true

示例 3:

输入: "(]"
输出: false

示例 4:

输入: "([)]"
输出: false

示例 5:

输入: "{[]}"
输出: true

解题思路

对于没有学过「栈」这个数据结构的同学来说可能遇到这一类的问题咋一看可能有点没有头绪,但是其实只需要判断下一个元素是否在栈顶即可判断括号的匹配情况,即如果遇到一个左括号,我们将这个符号插入压栈,如果遇到一个右括号,我们判断一下栈顶的元素是否是对应的左括号,如果是(即与栈顶元素匹配),那么就一起出栈,否则的话直接返回 false 表示字符串无效。

我们来看一例子,假设字符串是 ( ) [ ],栈的变化分别为:

  1. ( 入栈
  2. ) 入栈,发现与栈顶元素 ( 匹配,出栈,目前栈为空
  3. [ 入栈
  4. ] 入栈,发现和栈顶元素 [ 匹配,出栈,栈为空

而如果是:(],栈的变化会是怎么样的呢?

  1. ( 入栈
  2. ] 入栈,栈顶元素为 (,不匹配,直接返回 false

C++ 代码实现如下

class Solution {
public:bool isValid (string const& s) {// 定义左右两边的括号序列string left = "([{";string right = ")]}";stack<char> stk;
​for (auto c : s) {// 判断每一个输入的字符是否为左括号,如果是就压栈if (left.find(c) != string::npos) {stk.push (c);} else {// 如果不是左括号,且如果发现栈为空,或者栈顶元素不是匹配的左括号的话,就返回 falseif (stk.empty () || stk.top () != left[right.find (c)])return false;// 如果匹配的话,就把栈顶出栈elsestk.pop ();}}return stk.empty();}
};

有了栈的知识之后,另一个可以用栈来完成的操作是实现一个队列。

http://www.dtcms.com/a/349319.html

相关文章:

  • 顶升机设计cad+三维图+设计说明书
  • AR智能巡检:重塑消防行业新未来
  • 【Axure高保真原型】嵌套表格_查看附件
  • AR智能巡检:智慧工地的高效安全新引擎
  • zookeeper-znode解析
  • 【P2P】P2P主要技术及RELAY服务实现
  • 前端 Promise 全面深入解析
  • Unity中的特殊文件夹
  • 【Python】在 Pydantic 模型中使用非 Pydantic 定义的类作为模型字段类型
  • Java项目-苍穹外卖_Day2
  • 8 设计URL短链
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(二十) 文件、文件夹选择框、保存文件框
  • qt配置ros2环境,简单版本
  • Rust:变量、常量与数据类型
  • 2025 突出的时序模型
  • 【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day13
  • Linux-Redis的安装
  • 第四章:并发编程的基石与高级模式之Select语句与多路复用
  • 【Linux】开发工具命令指南:深度解析Vim的使用操作
  • Allegro17.4导出带有NET的PDF文档及组装样式图
  • MongoDB vs MySQL:NoSQL 和 SQL 的核心区别与适用场景
  • 前端开发:详细介绍npm、pnpm和cnpm分别是什么,使用方法以及之间有哪些关系
  • CPTS-Pressed复现(XML-RPC)
  • Python 面向对象进阶:深入理解封装、继承与多态
  • 【C++】第二十六节—C++11(中) | 右值引用和移动语义(续集)+lambda
  • 验证码流程
  • 【AMBA总线互联IP】
  • 6、RocketMQ消息积压问题如何解决
  • QSpinBox的用法及其使用QSS对其美化
  • 【ElasticSearch】json查询语法和可用的客户端