给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号
题目要求首先读好:
我一开始的思路是这样的
如果输入的是奇数那肯定不用想直接排除掉
如果要是偶数的话对第一个进行判断如果要是右括号打头也直接结束
然后进行标志位什么的相加 比如要是来个 [ 先标志位++ 如果标志位>0那么遇到 ]标志位-- 然后给[ 和 ] 这两个括号各一个计数 最后判断所有的这些计数是否相同 最后被[ ( { ] ) } 教做人了虽然这个跟我写的条件一样 但是根本不是有效的括号 题目说的有效括号是指每一个字符串的子字符串都互相配对 具体可能我个人表达能力有限各位去练习的时候就知道了 最后我看大家的思路说是用栈,然后我按照我一开始的思路想 那要是位置不对该怎么出栈呢后来发现是我想多了,人家给的这个字符串中的元素就是按照栈的思路来进行配对的根本不会出现我说的问题
struct Node
{
char data;
struct Node* pNext;
};
struct Stack
{
struct Node* pTop;
struct Node* pBottom;
};
void init(struct Stack* pS);//初始化
void push(struct Stack* pS, int val);//压栈
void pos(struct Stack* pS);//出栈
bool empty(struct Stack* pS);//判断栈是否为空,为空返回1,不为空返回0
char Top_list(struct Stack* pS); //标记栈顶元素
/*
1.首先奇数肯定直接结束不是有效括号个数
2.进行入栈操作,如果要是栈为空并且首个进来的是右括号直接结束
3.然后进行入栈的时候这么操作可以很好理解:进来左括号我们自动压入右括号
然后出栈的时候右括号直接和栈顶元素匹配 如果相同那么出栈
如果不相同那么进来的是别的右括号不匹配 字符串肯定无效直接结束
4.判断栈是否为空,为空则正确,否为左括号多了结束
*/
bool isValid(char * s){
int sLen=strlen(s);
struct Stack S;
init(&S);
char Top;
if(sLen%2!=0) return 0;//奇数直接结束
for(int i=0;i<sLen;i++)
{
Top=Top_list(&S);//栈顶元素
if(((s[i]==']')||(s[i]=='}')||(s[i]==')'))&&(empty(&S)==1)) //如果栈为空并且进来右括号结束
return false;
else if((s[i]=='[')||(s[i]=='{')||(s[i]=='('))//进来左括号压入右括号
{
switch(s[i])
{
case '[':push(&S,']');break;
case '{':push(&S,'}');break;
case '(':push(&S,')');break;
}
}
//准备出栈
else if(((s[i]==']')||(s[i]=='}')||(s[i]==')'))&&(Top!=s[i])) //如果进来的右括号!=栈顶元素结束
return false;
if(((s[i]==']')||(s[i]=='}')||(s[i]==')'))&&(empty(&S)==0))
{
if(s[i]==Top)//如果栈顶==右括号出栈
pos(&S);
}
}
if(empty(&S))//栈为空则ok
return 1;
else
return 0;
}
/*
各位要是这里看不懂的可以跟着用手画一下,这里我觉得很好理解,如果实在不理解可以去某站看一下郝斌老师的视频关于栈的实现 我认为是非常好的 这里给郝斌老师打call!!!
大家看视频一定要认真看争取自己能实现栈的初始化,入栈,出栈,遍历栈,判断栈是否为空等
然后再对内容进行适当的修改就可以了,大家写程序一定要动手!!!
*/
/*栈实现*/
char Top_list(struct Stack* pS)
{
char Top;
struct Node* pt = pS->pTop;
Top=pt->data;
return Top;
}
bool empty(struct Stack* pS)
{
if (pS->pTop == pS->pBottom)
return true;
else
return false;
}
void pos(struct Stack* pS)
{
if (empty(pS) == true) return false;
else
{
struct Node* pt = pS->pTop;
pS->pTop = pS->pTop->pNext;//或者pS->pTop =pt->Next;
free(pt);
pt = NULL;
return true;
}
}
void push(struct Stack* pS, int val)
{
struct Node* pNew = (struct Node*)malloc(sizeof(struct Node));
pNew->data = val;
pNew->pNext = pS->pTop;
pS->pTop = pNew;
}
void init(struct Stack* pS)
{
pS->pTop = (struct Node*)malloc(sizeof(struct Node));
pS->pBottom = pS->pTop;
pS->pTop->pNext = NULL;
}
这题我从中午12点左右开始写到大概4点左右结束,期间我对栈这个东西如何实现的重新学习并且自己实现了一下然后按照别人的思路自己的写法书写了出来,我认为这是C里面最容易理解的写法了其他的那些题解我没看过Stack函数没用过所以不打算用他们的写法 ,于是我自行书写了一下自己的写法,别的不说,有的时候看一下别人的思路真的比自己思考半天要好很多,如果你实在想不出来一定要看看别人的写法!!一定!!
然后今天就写一道题就好了,有点心力憔悴了......简单题我都写这么久这以后要是笔试写不完可就nono了,休息一下吃个饭,继续学苦逼的32了!但是昨天我反复看了好久好久那个EXTI中断总算大概理解了底层是怎么回事了,然后固件库编程的话思路都是一个样子 !!马上开学了学校通知20号去,可算不用在家憋着了,在家憋着效率可不太高还是去学校实验室好点哈哈!
237

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



