题目-有效的括号
一、分析题目
二、编写代码
typedef char STDataType;typedef struct Stack
{STDataType* a; //int top; //相当于数组下标,注意栈为空时,top的值应该为?int capacity;//栈的容量
}ST;void STInit(ST* pst);
void STDestroy(ST* pst);//入栈
void STPush(ST* pst,STDataType x);//出栈
void STPop(ST* pst);//栈顶元素
STDataType STTop(ST* pst);//判断栈是否为空
bool STEmpty(ST* pst);//获取size
int STSize(ST* pst);
void STInit(ST* pst)
{assert(pst);pst->a = NULL;pst->top = 0;//top指向-1,表示栈顶元素数据 0 栈顶数据下一位置pst->capacity = 0;
}void STDestroy(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->top = pst->capacity = 0;
}
//判断栈是否为空
bool STEmpty(ST* pst)
{assert(pst);return pst->top == 0;
}//入栈
void STPush(ST* pst, STDataType x)
{if (pst->top == pst->capacity){int newCapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = realloc(pst->a, newCapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail");return;}pst->a = tmp;pst->capacity = newCapacity;}pst->a[pst->top] = x;pst->top++;
}//出栈
void STPop(ST* pst)
{assert(pst);assert(!STEmpty(pst));pst->top--;
}//栈顶元素
STDataType STTop(ST* pst)
{assert(pst);assert(!STEmpty(pst));return pst->a[pst->top - 1];
}//获取size
int STSize(ST* pst)
{assert(pst);return pst->top;
}bool isValid(char* s) {ST st;STInit(&st);while(*s){if(*s=='['||*s=='{'||*s=='('){STPush(&st,*s);}else{if(STEmpty(&st)){STDestroy(&st);return false;}char top = STTop(&st);STPop(&st);if((*s == ']'&& top != '[')||(*s=='}'&&top!='{')||(*s==')'&& top !='(')){STDestroy(&st);return false;}}++s;}bool ret = STEmpty(&st);STDestroy(&st);return ret;
}