题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
C
思路分析
栈:先进后出,后进先出
当我们遇到一个左括号时,我们会期望在后续的遍历中,有一个相同类型的右括号将其闭合。由于后遇到的左括号要先闭合,因此我们可以将这个左括号放入栈顶
代码实现
bool isValid(char* s){
//堆栈解决
int len=strlen(s), top=0; //栈顶的指向,开始的时候为0
//建立一个栈
char* stack=(char*)malloc((len+1)*sizeof(char));
while(*s) //遍历字符串
{
if(*s=='{' || *s=='[' || *s=='(') //遇到左括号,入栈
{
// stack[top++] = *s;
//将左括号转化为右括号存在其中,方便后面的判断
if(*s == '{')
stack[top++] = '}';
else if(*s == '(')
stack[top++] = ')';
else
stack[top++] = ']';
}
else //遇到右括号,出栈
{
if(top==0) //第一个元素是右括号,错误
return false;
char tmp=stack[--top]; //取出栈顶元素(左括号)
if(tmp != *s){
return false;
}
}
++s;
}
if(top!=0) //遍历结束后,栈不空,则有问题
return false;
else
return true;
}
结果
嘿嘿嘿
感受
其实括号匹配这个问题,在当时数据结构老师讲到堆栈的时候就提过一些。但是自己从来没有想去实现过。这次当第一眼看见这个问题的时候,就想过使用栈来解决这个问题。最后能解决感觉还是蛮不错的,加深了对栈的理解和使用。
进阶版
我也不知道有没有,就暂时写着吧