[算法] leetcode_括号匹配问题

1.前言

此篇文章中,不会对栈的基本操作进行赘述,如果需要查看栈的具体操作,可以点击这个链接: 栈的基本操作以及利用栈实现二进制计算器

2.题目详情

20. 有效的括号
	给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。
	有效字符串需满足:
	左括号必须用相同类型的右括号闭合。
	左括号必须以正确的顺序闭合。
 
	示例 1:
	输入:s = "()"
	输出:true

	示例 2:
	输入:s = "()[]{}"
	输出:true

	示例 3:
	输入:s = "(]"
	输出:false

	示例 4:
	输入:s = "([)]"
	输出:false

	示例 5:
	输入:s = "{[]}"
	输出:true
 

	提示:
	1 <= s.length <= 104
	s 仅由括号 '()[]{}' 组成

	https://leetcode-cn.com/problems/valid-parentheses/

3.思路分析

题目要求对输入的括号进行匹配,如果全部匹配完成,则返回true,如果没有匹配项,则返回false。
可以观察输入字符串的结构,如果正常每个括号都有匹配项的话,那利用栈结构,遇到左括号入栈对应的右括号,遇到右括号判断栈顶元素是否相同,相同则出栈。最后判断栈内是否还有剩余元素,有则一定不匹配。
在这里插入图片描述

4. 代码

// 判断当前字符是否为左括号,如果是则进行入栈。如果是右括号,则代表栈顶一定有与之匹配的左括号,如果没有匹配项则当前括号不匹配
bool isValid(char* s) 
{
	if (strlen(s) <= 1)
		return false;

	Stack ps;
	StackInit(&ps);

	bool flag = true;

	for (int i = 0; i < strlen(s); i++)
	{
		// 如果当前字符是左括号,则入栈对应的右括号
		if ('(' == s[i])
		{
			StackPush(&ps, ')');
		}
		else if ('[' == s[i])
		{
			StackPush(&ps, ']');
		}
		else if ('{' == s[i])
		{
			StackPush(&ps, '}');
		}
		else
		{
			// 如果当前元素为右括号,则判断栈顶元素是否相同,如果相同则出栈栈顶元素
			if (!StackEmpty(&ps) && StackTop(&ps) == s[i])
			{
				StackPop(&ps);
			}
			else
			{
				flag = false;
				break;
			}
		}
	}

	// 最后判断栈是否为空,如果不为空则说明最后入栈的括号为左括号,并且没有右括号继续入栈
	if (!StackEmpty(&ps))
		flag = false;

	StackDestroy(&ps);
	return flag;
}

版权声明:本文为weixin_43717520原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。