给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
实现的思路(传统方式):
1压栈的是左括号([,(,{)
2遇到右括号出站。
3stack为空,字符串为空的情况下返回true
不足:额外申请空间,代码长又长,还不如使用指针和数组做啊(凋零)
struct list
{
char str;
struct list *next;
};
bool empty_stack(struct list *st)
{
if(st==NULL)
return true;
else
return false;
}
struct list * push_stack(struct list* st,char str)
{
struct list *node ;
node=malloc(sizeof(*node));
node->str=str;
node->next=st;
st=node;
return st;
}
struct list * pop_stack(struct list* st)
{
if(empty_stack(st))
return false;
st=st->next;
return st;
}
bool isValid(char * s)
{
int i;
struct list * st=NULL;
if(strlen(s)%2)
return false;
for(i=0;i<strlen(s);i++)
{
if(s[i]=='(' )
{
st=push_stack(st,s[i]);
s[i]='0';
}
if(s[i]=='[')
{
st=push_stack(st,s[i]);
s[i]='0';
}
if(s[i]=='{')
{
st=push_stack(st,s[i]);
s[i]='0';
}
if(st&&st->str=='('&&(s[i]==')'))
{
st=pop_stack(st);
s[i]='0';
}
if(st&&st->str=='['&&(s[i]==']'))
{
st=pop_stack(st);
s[i]='0';
}
if(st&&st->str=='{'&&(s[i]=='}'))
{
st=pop_stack(st);
s[i]='0';
}
}
if(empty_stack(st))
{
for(i=0;i<strlen(s);i++)
{
if(s[i]!='0')
return false;
}
return true;
}
return false;
}