【栈练习】 - 有效的括号

题目描述

描述
给定一个只包括‘(’,‘)’,‘{’,‘}’,‘[’,‘]’的字符串s,判断字符串需满足:
1、左括号必须用相同类型的右括号闭合。
2、左括号必须以正确的顺序闭合。

示例1

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

示例2

输入:s = "(]"
输出:false

示例3

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

解题分析:

思路:依次判断字符串的每个字符,如果是左括号,则进栈,如果是右括号,则和出栈的左括号比较。直到所有的字符匹配完结束。
1、左括号:( { [
2、右括号: ) } ]


代码实现:

方法1

#include "Stack.h"
typedef char STDataType;
bool IsValid(char* s)
{
	ST st;
	StackInit(&st);
	while (*s)//s是字符串,*s表示s[i] != '\0'继续
	{
		//如果s[i]是左括号,则进栈
		if (*s == '(' || *s == '{' || *s == '[')
		{
			StackPush(&st, *s);
			++s;
		}
		else
		{
			//当输入的字符串是:"]"时,此时栈没有内容,栈为空。
			//没有下面的判断,直接StackTop(&st)就会报错。因为assert(!StackEmpty(ps));断言报错。
			if (StackEmpty(&st))
			{
				//注意:如果遇到的就是右括号,但栈中无数据,说明前面没有左括号,不匹配,返回false。如"[]]()"
				StackDestroy(&st);
				return false;
			}

			//如果s[i]是右括号,则取栈顶的符号与字符串中的符号s[i]比较,并栈顶的元素出栈
			STDataType top = StackTop(&st);
			StackPop(&st);
			if ((*s == '}' && top != '{') || (*s == ']' && top != '[') || (*s == ')' && top != '('))
			{
				StackDestroy(&st);
				return false;
			}
			else
			{
				++s;
			}
		}
	}

	//如果栈不是空,说明栈中还有左括号未出栈,没有与字符串s[i]匹配,返回是false,否则返回true
	//当输入字符串:"["时,ret = false
	bool ret = StackEmpty(&st);

	StackDestroy(&st);//注意:返回前一定要释放栈,否则会造成内存泄漏。
	return ret;
}

方法2

//s = "([]}"
//栈:( [
//1、左括号,入栈
//2、右括号,出栈顶的左括号,跟右括号判断是否匹配
//如果匹配,则继续,否则终止
bool IsValid(char* s)
{
	ST st;
	StackInit(&st);
 	while (*s !='\0')//*s表示s[0]不为空
	{
		//如果是左括号,则进栈
		switch (*s)
		{
			case '(':
			case '{':
			case '[':
			{
				StackPush(&st, *s);
				++s;
				break;
			}
			case ')':
			case '}':
			case ']':
			{
				//当输入:"]"时,栈为空
				//遇到右括号,但栈中无数据,说明前面没有左括号,不匹配,返回false
				if (StackEmpty(&st))
				{
					StackDestroy(&st);
					return false;
				}
				//右括号,出栈顶的左括号,跟右括号判断是否匹配
				char top = StackTop(&st);
				StackPop(&st);
				if ((*s == '}' && top != '{') || (*s == ']' && top != '[') || (*s == ')' && top != '('))
				{
					StackDestroy(&st);
					return false;
				}
				else
				{
					++s;
				}
				break;
			}
			default:
				break;
		}
	}
	//如果栈不是空,说明栈中还有左括号未出
	//没有匹配,返回是false
	//当输入:"["时,ret = false
	bool ret = StackEmpty(&st);

	StackDestroy(&st);
	return ret;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值