What's past is prologue. 凡是过去,皆为序章。
题目
分析
1. 我们可以用栈的结构来解决这道题。
2. 我们使用while循环,每次读取字符串中一个元素进行操作,直到最后读取到 '\0'为止。
3. 如果遇见 '(', '[' ,'{' 这三种左括号,则把该左括号入栈;如果遇见 ')', ']' ,'}' 这三种右括号,则出栈一个栈中的元素。
4. 如果出栈的元素与右括号不匹配,则返回 false;如果匹配,则继续进行下一步。比如:这种情况 " ()[} "。
5. 读取到右括号时,先判断栈中是否还有元素,如果没有元素出来匹配,则说明右括号存在不能匹配情况,则直接返回 false。比如:这种情况 '' ()) "。
6. 对子字符串的遍历结束之后,需要再去判断栈中是否还有元素,如果有说明左括号存在不能匹配情况,则直接返回 false。比如:这种情况 '' (() "。
代码实现
bool isValid(char* s)
{typedef struct Stack {char* arr;int capacity;int top;} Stack;void InitStack(Stack * ps) {assert(ps);ps->arr = NULL;ps->capacity = ps->top = 0;}void PushStack(Stack* ps,char x){assert(ps);if(ps->capacity == ps->top){int newcapacity=ps->capacity==0?4:2*ps->capacity;char* tmp=(char*)realloc(ps->arr,sizeof(char)*newcapacity);if(tmp==NULL){perror("realloc fail");exit(1);}ps->arr=tmp;ps->capacity=newcapacity;} ps->arr[ps->top++]=x;}void PopStack(Stack * ps){assert(ps);assert(ps->top!=0);ps->top--;}char TopStack(Stack * ps){assert(ps);assert(ps->top!=0);return ps->arr[ps->top-1];}void DestroyStack(Stack * ps){assert(ps);if (ps->arr){free(ps->arr);//释放动态数组空间}ps->arr = NULL;ps->capacity = ps->top = 0;}Stack stack;InitStack(&stack);while(*s!='\0'){if(*s=='('||*s=='['||*s=='{'){PushStack(&stack,*s);}else{if(stack.top==0){DestroyStack(&stack);return false;}char ch=TopStack(&stack);if((ch=='('&&*s==')')||(ch=='['&&*s==']')||(ch=='{'&&*s=='}')){PopStack(&stack);}else{DestroyStack(&stack);return false;}}s++;}if(stack.top!=0){DestroyStack(&stack);return false;}DestroyStack(&stack);return true;
}
致谢
感谢您花时间阅读这篇文章!如果您对本文有任何疑问、建议或是想要分享您的看法,请不要犹豫,在评论区留下您的宝贵意见。每一次互动都是我前进的动力,您的支持是我最大的鼓励。期待与您的交流,让我们共同成长,探索技术世界的无限可能!