问题
思路
这个题要理解透彻采用栈的结构,遇到(,{,[,三种结构就进行入栈,每次出现相对的就与栈顶相比较,如果栈顶没有东西可比较的则也是错误情况返回false,如果不同就返回false;如果相同栈顶指针向下移动,对消完毕,舍弃前面栈顶的值,pt指向新的栈顶。
还有一种情况就是最后没有对消完,也就是((((的情况,则要返回假
- 只要进入这个else里面就代表要与栈顶进行对比,看看能不能对消掉
- 如果栈顶没有存放任何东西,就代表这个进入是错误的进入,因为你进来的目的就是要与栈顶进行对比的,所以pt==0时进入这个else也是错误的一种情况
- 想要与栈顶对消,就要保证栈顶是有与之对消的东西存在的,否则对消什么??
- 例如:(){}}{的情况,运行到栈顶,已经栈顶已经为空了,说明(){}已经对消完了,如果下一个正确,就应该入栈,但是}显然会出栈,所以会出现错误结果
解题方法
模仿栈
Code
bool isValid(char* s) {
int len = strlen(s);
char* temp = (char*)malloc(sizeof(char) * 50000); // 栈
int pt = 0;
// 这个题要理解透彻采用栈的结构
// 遇到(,{,[,三种结构就进行入栈,每次出现相对的就与栈顶相比较,如果相同就出栈,如果不同就返回false
if(len<=1||len%2==1)return false;
while (*s != '\0') {
if (*s == '(' || *s == '[' || *s == '{') {
temp[pt++] = *s++;
} else {
//只要进入这个else里面就代表要与栈顶进行对比,看看能不能对消掉
//如果栈顶没有存放任何东西,就代表这个进入是错误的进入,所以pt==0时进入这个else也是错误的一种情况
//想要与栈顶对消,就要保证栈顶是有东西存在的,否则对消什么??
//例如:(){}}{的情况,运行到栈顶,已经栈顶已经为空了,说明(){}已经对消完了,如果下一个正确,就应该入栈,但是}显然会出栈,所以会出现错误结果
switch (*s) {
case ']':*s = '[';break;
case ')':*s = '(';break;
case '}':*s = '{'; break;
}
//这里要理解pt==0条件为假的重要性,因为如果都没有往temp里面放东西,就代表不存在对消
//例如:(){}}{的情况
if (pt==0||*s++ != temp[--pt]) {
return false;
}
}
}
if (pt == 0)//最后没有对消完,也就是((((的情况,则要返回错误
return true;
else
return false;
}