给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
bool isValid(char * s){
int length = strlen(s); 求出字符串的长度
char Stack[length]; 定义一个顺序栈
int top = -1; 初始化栈
for(int i = 0; i < length; i++){ 从左往右扫描字符串
if(s[i] == '(' || s[i] == '[' || s[i] == '{'){ 扫描左括号
Stack[++top] = s[i]; 左括号入栈
}else{
if(top == -1)
return false; 扫描到右括号且栈为空,则括号匹配失败
char topElem;
topElem = Stack[top--]; 出栈一个元素并赋值给topElem
if(s[i] == ')' && topElem != '(')左右括号不匹配
return false;
if(s[i] == ']' && topElem != '[')左右括号不匹配
return false;
if(s[i] == '}' && topElem != '{')左右括号不匹配
return false;
}
}
if(top != -1)
return false; 扫描到完字符串s后栈不空,则括号匹配失败
return true;
}
该题运用了栈·,栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈是先入后出,堆是先出后入,感兴趣的同学可以去了解一下,了解栈以后,然后我们来看一下,该题·的解题思路。
(){} []
首先通过一个栈,然后将左括号全部放入栈中,到了右括号后进入else语句中,此时的栈
[ |
{ |
( |
然后将栈中的数据取出和右括号比较,看是配对,配对完后看栈中是否有数据,有则返回错误,无则返回正确。