有效的括号详解 | C语言用动态数组实现栈解决
原题链接:
https://leetcode.cn/problems/valid-parentheses/description/
https://leetcode.cn/problems/valid-parentheses/description/
解题思路
这个题目的括号要成功闭合有3个条件:
1.按顺序闭合
2.括号类型正确
2.括号数量正确
第一个按顺序闭合就是,遇到右括号前的最右边的左括号要和该右括号匹配。这一要求使用栈先进后出的特性处理左括号就很方便。遇到左括号压入栈,遇到右括号时出栈,遇到右括号前的最右边的左括号一定在栈顶。
所以要实现一个栈,把遇到左括号就入栈,遇到右括号就和栈顶的括号配对。

下面来实现栈。
使用动态数组实现栈
代码如下:
typedef int STDataType;
typedef struct Stack
{STDataType* data;int capacity;int top;
}ST;
//初始化栈
void STInit(ST* ps)
{//这里先不开辟空间,因栈只有在压栈的时候有扩容assert(ps);ps->data = NULL;//top is the next element of the top of the stackps->top = 0;ps->capacity = 0;
}
//动态开辟,要销毁栈
void STDestory(ST* ps)
{assert(ps);free(ps->data);
}
//压栈
void STPush(ST* ps, STDataType val)
{//因为栈只有这里会用到扩容,所以不需要封装成函数if (ps->top == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : 2* ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->data, sizeof(ST) * newcapacity);if (tmp == NULL){perror("realloc");exit(-1);}ps->data = tmp;ps->capacity += newcapacity;}ps->data[ps->top] = val;ps->top++;
}
//出栈
void STPop(ST* ps)
{assert(ps);assert(ps->top > 0);ps->top--;
}
//获取栈顶元素
STDataType STTop(ST* ps)
{assert(ps);return ps->data[ps->top - 1];
}
//栈为空判断
int STEmpty(ST* ps)
{assert(ps);if (ps->top == 0)return 1;elsereturn 0;
}
运用实现的栈解题
bool isValid(char* s) {//创建一个栈ST sa;//初始化STInit(&sa);while(*s){//左括号入栈if(*s == '(' || *s == '{' || *s == '['){STPush(&sa,*s);// s go ons++;}else{//栈为空//1.整体来说,右括号和左括号的数量不匹配//2.该右括号的左边没有左括号(可能是该右括号是第一个元素,或者左括号已全pop)if(STEmpty(&sa)){STDestory(&sa);return false;}//右括号的类型和左括号不匹配if((*s == '}' && STTop(&sa) != '{')|| (*s == ')' && STTop(&sa) != '(')|| (*s== ']' && STTop(&sa) != '[')){STDestory(&sa);return false;}//右括号和左括号闭合成功else{//pop stack top elementSTPop(&sa);//s go ons++;}}} //左括号的数量闭右括号多,左括号和右括号的数量不匹配 if(!STEmpty(&sa))return false; STDestory(&sa);return true;
}
其他写法
结尾的返回也可以这么写

判断代码也可以用另一种写法
if((*s == '}' && STTop(&sa) != '{')|| (*s == ')' && STTop(&sa) != '(')|| (*s== ']' && STTop(&sa) != '[')){STDestory(&sa);return false;}
新写法:
char topval = STTop(&sa);//右括号的类型和左括号不匹配if((*s == '}' && topval != '{')|| (*s == ')' && topval != '(')|| (*s== ']' && topval != '[')){STDestory(&sa);return false;}
这种写法是空间换时间。
