注:本题为【C语言编码练习】03题目的变形。
问题描述:
给出一个仅包含字符’(‘,’)‘,’{‘,’}‘,’[‘和’]',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()“和”()[]{}“都是合法的括号序列,但”(]“和”([)]"不合法。
数据范围:字符串长度 0≤n≤10000
要求:空间复杂度 O(n),时间复杂度 O(n)
输入描述:
一个" "中只含()[]{}的字符。
输出描述:
合法输出"true”;
不合法输出“false”。
举例:
//输入:
()[]{}
//返回值:
true
代码结果:
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
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',相当于栈空了,则报对
}
int main()
{
char s[10000];
gets(s);//输入字符串
if(isValid(s)==1)//调用判断
printf("true");
else printf("false");
}

本文介绍如何使用C语言实现一个函数,检查输入的括号序列是否有效,遵循'()'和'[]{}
2401

被折叠的 条评论
为什么被折叠?



