原题链接:
20. 有效的括号 - 力扣(LeetCode)
思路分析:
第一步:先搭建一个数据结构——栈。
typedef char STDataType;
typedef struct Stack
{STDataType* arr;int top, capacity;
} Stack;//初始化
void StackInit(Stack* ps)
{assert(ps);ps->arr = NULL;ps->top = ps->capacity = 0;
}//入栈
void StackPush(Stack* ps, STDataType x)
{assert(ps);if(ps->top == ps->capacity){int NewCapacity = (ps->capacity == 0) ? 4 : ps->capacity * 2;STDataType* temp = (STDataType*)realloc(ps->arr, sizeof(STDataType) * NewCapacity);ps->arr = temp;ps->capacity = NewCapacity;}ps->arr[ps->top++] = x;
}//判断栈是否为空
bool StackEmpty(Stack* ps)
{assert(ps);return (ps->top == 0);
}//出栈
void StackPop(Stack* ps)
{assert(!StackEmpty(ps));ps->top--;
}//取栈顶元素
STDataType StackTop(Stack* ps)
{assert(!StackEmpty(ps));return ps->arr[ps->top - 1];
}//销毁
void StackDestroy(Stack* ps)
{assert(ps);if(ps->arr){free(ps->arr);}ps->arr = NULL;ps->top = ps->capacity = 0;
}
第二步:定义一个栈结构变量并初始化,再定义一个字符指针指向字符串。
Stack st;StackInit(&st);char* pi = s;
第三步:通过字符指针开始遍历数组,如果是左括号就把数据入栈,不是的话就要取栈顶数据来和*pi的值对比,如果不匹配就可以直接返回false了。如果遍历完了都没有返回false的话,还不能直接返回true,因为栈中可能还有左括号,所以还需要最后判断一下栈是否为空,为空了才是true,不为空就是false。
开始遍历之前:
第一次遍历之后:
第二次遍历之后:
第三次遍历之后:
第四次遍历之后:
第五次遍历之后:
第六次遍历之后:
while (*pi != '\0'){if ((*pi == '(') || (*pi == '[') || (*pi == '{')){StackPush(&st, *pi);}else{if (StackEmpty(&st))//*pi的值已经是右括号了,如果栈里面是空的话那属于不匹配了{StackDestroy(&st);return false;}char top = StackTop(&st);if ((top == '(' && *pi != ')')|| (top == '[' && *pi != ']')|| (top == '{' && *pi != '}')){StackDestroy(&st);return false;}StackPop(&st);}pi++;}bool ret = StackEmpty(&st) ? true : false;StackDestroy(&st);return ret;
完整代码:
bool isValid(char* s)
{Stack st;StackInit(&st);char* pi = s;while (*pi != '\0'){if ((*pi == '(') || (*pi == '[') || (*pi == '{')){StackPush(&st, *pi);}else{if (StackEmpty(&st))//*pi的值已经是右括号了,如果栈里面是空的话那属于不匹配了{StackDestroy(&st);return false;}char top = StackTop(&st);if ((top == '(' && *pi != ')')|| (top == '[' && *pi != ']')|| (top == '{' && *pi != '}')){StackDestroy(&st);return false;}StackPop(&st);}pi++;}bool ret = StackEmpty(&st) ? true : false;StackDestroy(&st);return ret;
}