Leetcode刷题之有效的括号(C语言版)
- 一、题目描述
- 二、题目测试用例
- 三、题目分析
- 四、完整代码
一、题目描述
20、有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:①、左括号必须用相同类型的右括号闭合。
②、左括号必须以正确的顺序闭合。
③、每个右括号都有一个对应的相同类型的左括号。
二、题目测试用例
三、题目分析
本题是要将左括号与右括号相匹配的进行闭合,所以我们想到采用“栈”的先进后出特性来进行数据的存放操作。所以我们先要写一个栈出来,包括栈的创建,栈的销毁等许多的基础操作。如果大家忘记了栈的相关操作如何去写,可以看我之前的文章《数据结构——栈的详细介绍》。写好栈之后,我们对于本道题的解题思路便是:
①、左括号入栈
if(*s=='('||*s=='{'||*s=='['){PushST(&st,*s);}
②、右括号出栈顶元素与其进行比较
这里需要注意的是如果当前只有一个任意的右括号,那么就没有可能出栈与其进行匹配操作,所以在此要对栈进行判空,保证当前栈内存在元素。如果当前栈内没有元素,便要对栈进行销毁操作,以防止内存的泄漏。
else{//判断栈当前是否为空if(STEmpty(&st)){//注意在此需要防止内存泄漏//销毁栈DestoryST(&st);return false;}//判断匹配问题char top=TopST(&st);//对栈顶元素进行出栈,更新栈顶元素PopST(&st);if((*s==']'&&top!='[')||(*s=='}'&&top!='{')||(*s==')'&&top!='(')){//注意在此需要防止内存泄漏//销毁栈DestoryST(&st);return false;}}
③、返回值
bool ret=STEmpty(&st);
查看当前栈内是否还存在其他的元素,如果没有则返回true,否则返回false。
四、完整代码
//定义数据类型
typedef char STDatatype;typedef struct STack
{STDatatype* a;//数组int capacity;//容量int top;//栈顶元素的下一个
}ST;//初始化
void InitST(ST* pst);
//销毁
void DestoryST(ST* pst);
//压栈
void PushST(ST* pst, STDatatype x);
//出栈
void PopST(ST* pst);
//判空
bool STEmpty(ST* pst);
//获取栈顶元素
STDatatype TopST(ST* pst);
//获取栈的size
int STSize(ST* pst);
//初始化
void InitST(ST* pst)
{assert(pst);pst->a = NULL;pst->capacity = 0;//栈顶元素的下一个位置pst->top = 0;
}
//销毁
void DestoryST(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->capacity = pst->top = 0;
}
//压栈
void PushST(ST* pst, STDatatype x)
{if (pst->top == pst->capacity){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDatatype *tmp = (STDatatype*)realloc(pst->a, sizeof(STDatatype) * newcapacity);if (tmp == NULL){perror("realloc fail");return;}pst->a = tmp;pst->capacity = newcapacity;}//插入数据pst->a[pst->top] = x;pst->top++;
}
//出栈
void PopST(ST* pst)
{assert(pst);assert(!STEmpty(pst));pst->top--;
}
//判空
bool STEmpty(ST* pst)
{assert(pst);return pst->top == 0;
}
//获取栈顶元素
STDatatype TopST(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;//初始化InitST(&st);//解题思路:①左括号入栈 ②右括号出栈while(*s){if(*s=='('||*s=='{'||*s=='['){PushST(&st,*s);}else{//判断栈当前是否为空if(STEmpty(&st)){//注意在此需要防止内存泄漏//销毁栈DestoryST(&st);return false;}//判断匹配问题char top=TopST(&st);//对栈顶元素进行出栈,更新栈顶元素PopST(&st);if((*s==']'&&top!='[')||(*s=='}'&&top!='{')||(*s==')'&&top!='(')){//注意在此需要防止内存泄漏//销毁栈DestoryST(&st);return false;}}++s;}bool ret=STEmpty(&st);//销毁栈DestoryST(&st);return ret;
}