前言
- 个人推荐在牛客网刷题(点击可以跳转),主要它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失,我觉得这一点还挺好的。
- 个人刷题练习系列专栏:个人CSDN牛客刷题专栏
- 牛客数据结构题目位置如下:
问题描述:
- 给出一个仅包含字符’(‘,’)‘,’{‘,’}‘,’[‘和’]',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()“和”()[]{}“都是合法的括号序列,但”(]“和”([)]"不合法。
数据范围:字符串长度 0≤n≤10000
要求:空间复杂度 O(n),时间复杂度 O(n)
输入描述:
一个" "中只含()[]{}的字符。
输出描述:
合法输出"true”;
不合法输出“false”。
举例:
//输入:
()[]{}
//返回值:
true
代码结果:
- 本题和核心是使用栈实现括号匹配的过程,代码如下
char trans(char char_r) { //实现一个转换函数
if (char_r == ')')return '(';
if (char_r == ']')return '[';
if (char_r == '}')return '{';
return 0;
}
bool isValid(char* s ) {
char* stack;
int topIdx = 0;
stack = (char*)malloc(strlen(s) * sizeof(char)); //stack就指向一个有s长度*sizeof(char)个连续空间的首地址,stack+1就是第二个空间的地址。简单总结就是申请空间,有多少空间就有多少地址。
//C库函数(size_t strlen(const char *str) ;)计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。
//(char*)malloc(x*sizeof(char));假设x=2,那么就是申请了2个连续的字节,也就有2个连续的地址,但是返回的是首地址。因为空间是连续的,所以可以通过首地址计算其他地址。
for (int i = 0; i < strlen(s); i++)
{ //循环遍历
if (s[i] == '(' || s[i] == '[' ||s[i] == '{')
{ //是前括号则赋值进堆区,即入栈
stack[topIdx++] = s[i]; //赋值后++,topIdx始终指向栈顶的下一个
}
if (s[i] == ')' || s[i] == ']' ||s[i] == '}')
{ //是后括号则判断匹配,即出栈
if (topIdx < 1)return 0; //栈空了还有后括号,则报错
if (stack[topIdx - 1] == trans(s[i]))
{ //使用栈顶进行匹配
stack[--topIdx] ='\0'; //匹配成功,消去栈顶,即赋值'\0',栈顶变化为前一个值,指向的为栈顶的下一个,相当于出栈操作
} else return 0; //匹配失败则报错
}
}
if (strlen(stack) > 0)return 0; //申请的空间内还有东西,则栈未空,则报错
else return 1;//申请的空间首地址内容都是'\0',相当于栈空了,则报对
}
结束语
- 以上就是有效括号序列的内容。可以在牛客尝试刷几道单链表题目来练习实践。牛客网刷题(点击可以跳转),可以尝试注册使用。