有效括号的判段失灵问题

黑白
  • 136
bool isValid(char * s){
char *str;
str=(char *)malloc(sizeof(strlen(s)) +1);
int top=0 , i=0;
str[0]=='a'
// 预留一个判空;
while(s[i]!='\0') //退出的条件;
{
       // 左括号进栈;
        if(s[i]=='(' || s[i]=='{' || s[i]=='[' )
        {
               top++;
               str[top]=s[i];
        }
        else
        {
                            
                 //判段不退栈的条件;
                  if(s[i]==')'&&(str[top]=='{' || str[top]=='['  || str[top]=='a') )
                  return false;
                  else if(s[i]=='}' &&  (str[top]=='[' || str[top]=='(' || str[top)=='a )
                   return false;
                  else  if(s[i]==']' && ( str[top]== '{' || str[top]=='(' || str[top]=='a') )
                  return false;
                  // 上述的情况都不满足时就执行退栈操作;
                  top--;
        }
        i++;
}
   if(top!=0) 
   return false;
   else
   return true;
}


为什么在括号特别多的时候会发生;执行错误;
希望解释一下?
谢谢
回复
阅读 1.3k
2 个回答
黑白
  • 136
✓ 已被采纳

这个程序主要存在两个问题,
1 top 可能达到int 的上线造成错误,改为long int ;
2 空间的申请写法不正确,

str=(char *)malloc(sizeof(strlen(s)) +1)

改为
n=strlen(s);
str=(char )malloc(sizeof(char)(n+1));

bool isValid(char * s){
char *str;
int  i=0, n;
long int top=0;
n=strlen(s);
str=(char *)malloc(sizeof(char)*(n+1));
// 预留一个判空;
str[0]='a';
while(s[i]!='\0') //退出的条件;
{
       // 左括号进栈;
        if(s[i]=='(' || s[i]=='{' || s[i]=='[' )
        {
               top++;
               str[top]=s[i]; 
        }
        else
        {
                            
                 //判段不退栈的条件;
                  if(s[i]==')'&&(str[top]=='{' || str[top]=='[' ||str[top]=='a' ) )
                  return false;
                  else if(s[i]=='}' &&  (str[top]=='[' || str[top]=='(' || str[top]=='a')  )
                   return false;
                  else  if(s[i]==']' && ( str[top]== '{' || str[top]=='('|| str[top]=='a' )  )
                  return false;
                  // 上述的情况都不满足时就执行退栈操作;
                  top--;
        }
        i++;
}
   if(top!=0) 
   return false;
   else
   return true;
str=(char *)malloc(sizeof(strlen(s)) +1); //内存大小错误 应该是 strlen(s) +1

//条件判断错误
if(s[i]==')'&&(str[top]=='{' || str[top]=='['  || str[top]=='a') )
  return false;
else if(s[i]=='}' &&  (str[top]=='[' || str[top]=='(' || str[top)=='a )
  return false;
else  if(s[i]==']' && ( str[top]== '{' || str[top]=='(' || str[top]=='a') )
  return false;
// 条件判断错误 top < 0 并不是 s[i] != ')}]'就要出栈
top--;
宣传栏