这里,我提供一种用栈来解决的方法:
思路:栈的结构是先进后出,这样我们就可以模拟栈结构了,如果是‘(’、‘{’、‘[’任何一种,直接push进栈就可以了,如果是‘}’、‘)’、‘]’任何一种就开始判断,看栈pop的是否和对应的字符匹配。
下面是源码:
typedef char STDateType; typedef struct Stack { STDateType* a; int top; int capacity; }Stack; void StackInit(Stack* ps); void StackPush(Stack* ps, STDateType x); void StackPop(Stack* ps); STDateType StackTop(Stack* ps); int StackSize(Stack* ps); bool StackEmpty(Stack* ps); void StackDestroy(Stack* ps); void StackInit(Stack* ps) { assert(ps); ps->a = NULL; ps->capacity = ps->top = 0; } void StackPush(Stack* ps, STDateType x) { assert(ps); if (ps->top == ps->capacity) { int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2; STDateType* tmp = (STDateType*)realloc(ps->a, sizeof(STDateType) * newcapacity); if (tmp == NULL) { perror("realloc fail"); exit(-1); } ps->a = tmp; ps->capacity = newcapacity; } ps->a[ps->top] = x; ps->top++; } void StackPop(Stack* ps) { assert(ps); --ps->top; } STDateType StackTop(Stack* ps) { assert(ps); return ps->a[ps->top - 1]; } int StackSize(Stack* ps) { assert(ps); return ps->top; } bool StackEmpty(Stack* ps) { assert(ps); return ps->top == 0; } void StackDestroy(Stack* ps) { assert(ps); free(ps->a); ps->a = NULL; ps->top = ps->capacity = 0; } bool isValid(char * s){ Stack st; StackInit(&st); char top; while(*s) { if((*s == '(') || (*s == '[') || (*s == '{')) { StackPush(&st,*s); }else { if(StackEmpty(&st)) { StackDestroy(&st); return false; } top = StackTop(&st); StackPop(&st); if((*s == ']' && top != '[') || (*s == '}' && top != '{') || (*s == ')' && top != '(')) { StackPop(&st); StackDestroy(&st); return false; } } ++s; } bool ret = StackEmpty(&st); StackDestroy(&st); return ret; }