题目
分析
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; }
致谢
感谢您花时间阅读这篇文章!如果您对本文有任何疑问、建议或是想要分享您的看法,请不要犹豫,在评论区留下您的宝贵意见。每一次互动都是我前进的动力,您的支持是我最大的鼓励。期待与您的交流,让我们共同成长,探索技术世界的无限可能!