题目
思路
本题的思路为创建一个栈stk,如果是左括号,则存入栈。遇见右括号,则将栈顶元素弹出栈,与右括号比较,是否为同一类型。不一样,返回false,一样,返回true。
代码
char paris(char a){
if(a=='}') return '{';
if(a==')') return '(';
if(a==']') return '[';
return 0;
}
这段代码用来判断括号。
bool isValid(char* s) {
int n=0;
n = strlen(s);
if(n%2==1)
return false;
int stk[n+1],top=0;
for(int i=0;i<n;i++){
char ch = paris(s[i]);
if(ch){
if(top==0||stk[top-1]!=ch){
return false;
}
top--;
}
else{
stk[top++] = s[i];
}
}
return top==0;
}
-
初始化栈
- 定义一个数组
stk
作为栈,长度为n+1
,以及一个栈顶指针top
,初始值为0。
- 定义一个数组
-
遍历字符串
- 循环遍历字符串
s
的每一个字符。 - 对每个字符,调用
paris
函数检查是否为右括号。如果是右括号,则ch
为对应的左括号,否则ch
为0。 - 如果
ch
不为0(即当前字符是右括号),则:- 检查栈是否为空或栈顶元素是否不是对应的左括号。如果是这种情况,返回
false
,因为括号不匹配。 - 否则,弹出栈顶元素(
top--
)。
- 检查栈是否为空或栈顶元素是否不是对应的左括号。如果是这种情况,返回
- 如果
ch
为0(即当前字符是左括号),将其压入栈顶(stk[top++] = s[i]
)。
- 循环遍历字符串
-
最终检查栈是否为空
- 最后检查栈是否为空。如果栈为空,则所有括号都匹配,返回
true
;否则返回false
。
- 最后检查栈是否为空。如果栈为空,则所有括号都匹配,返回