力扣:有效的括号 (C语言)

题目描述:

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

一、解题思路

这个题我扣了一下午,深刻反思了一下自己:就是做题少没有考虑到特殊情况或者是不会去考虑各种情况,写的我都想退学,尝试各种各样的方法,搜大家的csdn解题思路,害

 错误了很多遍,是真的想哭(因为实在不会想,不是故意的错这么多遍,因为是他给我的实例都能通过,特殊的过不了)不过最后解决了,好了,重点来了:

有两个思路,第一个是:比如字符串给了我一个’(‘,结合栈堆思想,我们把左括号的可以压入栈,等到右括号出来再匹配弹出。

需要注意的是:必须对称!就是说({})可以通过但是这种({)}你要给他卡出来,说到底还是堆栈的使用

第二个是:当字符串给我们一个’(‘时我们输入’)‘,到时候直接看后边的右括号是否等于你输入的就行,我只写了这个代码

二、代码

代码如下(示例):

char pairs(char a) {
    if (a == '{') return '}';
    if (a == '[') return ']';
    if (a == '(') return ')';
    return 0;
}//前边这个函数就是为了直接入栈右括号,下边好匹配
bool isValid(char * s){
     int stk[strlen(s)+1];
	int top=1;
	if(strlen(s)%2==1){//字符串不是偶数肯定不匹配
		return false;
	}
	else{
		for(int i=0;i<strlen(s);i++){
			if(s[i]=='('||s[i]=='['||s[i]=='{'){
				stk[top]=pairs(s[i]);
				top++;
			}
			else{
				
				if(s[i]!=stk[top-1]||top<0){//top-1是因为前边if语句块里边会多加一个1
					return false;	
				}
				top--;//相当于出栈
			}
		}
	}
    if(top==1)return true;
    else return false;
}

另外:我在写这个最大的问题就是top初值需要设置为1,不能为0或者-1,这个情况考虑的是右括号多于左括号的情况。

如果你初值设为0时,当你可以匹配的已经匹配完时右括号还多一个,左括号已经没有可以出的元素了,并且此时为了匹配右括号,会到-1也就是会报错

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值