思路分析:
1.规定凡是左边的部分全部入栈,凡是右边的部分就去和栈顶元素匹配
2.匹配的时候有三种情况,详见代码
3.只要是右边的匹配完之后就释放栈顶元素,以方便下一次遍历的元素入栈
4.我们在else语句中还加了一个判断条件,是为了判断我们我们的元素个数是不是偶数。试想一下,如果是奇数的话,假设前面的偶数项全部匹配成功,当遍历到最后一个元素的时候,我们的栈计数器已经到了-1,就已经可以返回false了。
5.当然我们也可以在else中不加这个判断条件,但是要在开头做一个判断,直接判断是不是偶数
if (n % 2 == 1) {
return false;
}
bool isValid(char * s){
int n = strlen(s);
int stack[n]; //定义了一个顺序栈
int top = -1;
for (int i = 0; i < n; i++) {
if (s[i] == '(' || s[i] == '{' || s[i] == '[' ) {//如果是左边的全部入栈
stack[++top] = s[i];
} else {
if (top == -1) { //特别关键的一步
return false; //每次出栈结束之后都要判断是否全部匹配结束
}
if (s[i] == ')' && stack[top] != '(') { //是右边的统一判断是否匹配
return false;
}
if (s[i] == ']' && stack[top] != '[') {
return false;
}
if (s[i] == '}' && stack[top] != '{') {
return false;
}
top--; //出栈
}
}
return top == -1;
}