力扣刷题:20. 有效的括号

题目要求

在这里插入图片描述

整体思路

创建一个存放字符的栈

接着遍历字符串:
当遇到左括号时就将其push进栈中

当遇到右括号时,首先检查栈是否为空。如果不为空则再检查栈的顶部元素是否为与该右括号匹配的左括号。如果匹配,将栈顶元素弹出。

最后检查栈是否为空:
为空返回true
不为空返回false

代码

class Solution {
public:
bool isValid(string s) 
{
  std::stack<char> stackChar;
  for (auto i : s)
  {
	//左括号入栈
	if (i == '(' || i == '{' || i == '[')
	{
	  stackChar.push(i);
	}
	//右括号查看栈顶是否匹配,如果匹配就将栈顶元素出栈
	else
	{
	  if (i == ')')
	  {
		if (stackChar.empty() || stackChar.top() != '(')
		  return false;
		stackChar.pop();
	  }
	  else if (i == '}')
	  {
		if (stackChar.empty() || stackChar.top() != '{')
		  return false;
		stackChar.pop();
	  }
	  else
	  {
		if (stackChar.empty() || stackChar.top() != '[')
		  return false;
		stackChar.pop();
	  }
	}
  }

  //符号栈为空,才返回true
  if (stackChar.empty())
  {
	return true;
  }
  return false;
}

};

学到了什么

1、别因为脑子一热就把&&和||写反了

if (i == '(' || i == '{' || i == '[')

这里弄错了一次,所以导致逻辑错误

2、边界判断:在查看栈顶元素时,首先需要确认栈不为空

if (stackChar.empty() || stackChar.top() != '(')

判断是否为空的语句写在前面,这样可以利用逻辑短路跳过访问空栈顶的语句
这里漏判栈是否为空,导致通不过编译

3、回想起了以前写词法分析器时碰到过类似的匹配问题
在这里插入图片描述
c语言的跨行注释也是这种匹配问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值