①括号匹配问题
1)题目链接
题目链接https://leetcode-cn.com/problems/valid-parentheses/
2)
typedef char STDatatype;
typedef struct Stack{
STDatatype* a; //栈起始位置
int top; //栈顶位置
int capacity; //栈的容量
}ST;
void StackInit(ST* ps);
void StackDestroy(ST* ps);
void StackPush(ST* ps, STDatatype x);
void StackPop(ST* ps);
STDatatype StackTop(ST* ps);
int StackSize(ST* ps);
bool StackEmpty(ST* ps);
void StackInit(ST* ps){
ps->a = (STDatatype*)malloc(sizeof(STDatatype)* 4);
ps->capacity = 4;
ps->top = 0;
/*
1)如果top 选择初始为 0,则在每次入栈或者出栈之后,
top指向的都是栈顶元素的下一个位置。
2)如果top 选择初始为 1,则在每次入栈或者出栈之后,
top指向的都是栈顶元素的当前位置。
*/
}
void StackDestroy(ST* ps){
assert(ps);
free(ps->a);
ps->a = NULL;
ps->capacity = ps->top = 0;
}
void StackPush(ST* ps, STDatatype x){
assert(ps);
//入栈之前要判断原栈是否已经满了
if (ps->top == ps->capacity){
STDatatype* tmp = (STDatatype*)realloc(ps->a, ps->capacity * 2 * sizeof(STDatatype));
//判断是否有足够的空间来扩容
if (tmp == NULL){
printf("realloc fail!");
exit(-1);
}
else{
ps->a = tmp;
ps->capacity *= 2;
}
}
ps->a[ps->top] = x;
ps->top++;
}
void StackPop(ST* ps){
assert(ps);
//倘若原来栈中没有元素,则top = 0,这时候调用StackPop直接报错。
assert(ps->top > 0);
//通过直接调用top--,直接可以达到栈顶元素出栈的效果
ps->top--;
}
STDatatype StackTop(ST* ps){
assert(ps);
//倘若原来栈中没有元素,则top = 0,这时候调用StackTop直接报错。
assert(ps->top > 0);
return ps->a[(ps->top) - 1];
}
bool StackEmpty(ST* ps){
assert(ps);
//采用return后面直接接表达式的方式
//1)如果top为0,则直接返回true
//2)如果top不等于,则直接返回false
return ps->top == 0;
}
bool isValid(char * s){
ST st;
StackInit(&st);
//当输入的括号串未结束时
while(*s != '\0'){
switch(*s){
case('('):
case('['):
case('{'):
{
//当输入的是左括号时,则入栈
StackPush(&st,*s);
++s;
break;
}
case(')'):
case(']'):
case('}'):
{
//当输入的是右括号时,出栈顶左括号,与输入的右括号匹配
//如果栈中没有元素(这种情况可能由右括号比左括号多导致,也可能输入的全是右括号)
if(st.top == 0){
StackDestroy(&st);
return false;
}
//将栈顶元素m弹出,与输入字符s比较
char m = StackTop(&st);
StackPop(&st);
//不匹配的三种情况
if((m == '(' && *s != ')')
||(m == '{' && *s != '}')
||(m == '[' && *s != ']')){
StackDestroy(&st);
return false;
}
//如果匹配
else{
++s;
break;
}
}
}
}
//如果输入的字符全是左括号,则将一直入栈,最后遇到'\0'结束循环,此时栈中还有很多元素,
//所以这里应该用栈是否空来判断是否匹配
bool ret = StackEmpty(&st);
StackDestroy(&st);
return ret;
}