Welcome to MLink Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
497 views
in Technique[技术] by (71.8m points)

表达式括号匹配问题,这样写代码有什么问题吗,为什么在系统上运行错误了

题目来源及自己的思路

题目:表达式括号匹配
我的思路:在栈中判断是不是{}[]()中的一个,是的话压入栈,然后判断是否与上一个匹配,是的话弹栈。最后依据栈的指针是否为-1来判断表达式括号匹配的结果

相关代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct seqstack{
    char s[100];
    int top;
}seqstack,*pseqstack;

pseqstack create()
{
    pseqstack head;
    head=(pseqstack)malloc(sizeof(seqstack));
    if(head==NULL) printf("Out space!!
");
    else head->top=-1;
    return head;
}

pseqstack push(pseqstack la,char c)
{
    if(la->top>=99) printf("overflow!
");
    else{
        la->s[(la->top)+1]=c;
        la->top++;
    }
    return la;
}

int ifpop(pseqstack la)
{
    if(la->s[la->top]==')'&&la->s[(la->top)-1]=='('){
        return 1;
    }
    else if(la->s[la->top]==']'&&la->s[(la->top)-1]=='['){
        return 1;
    }
    else if(la->s[la->top]=='}'&&la->s[(la->top)-1]=='{'){
        return 1;
    }
    else return 0;
}
 
int main()
{
    pseqstack la;
    la=create();
    char c[100];
    int i=0,k=0;    //k作为出栈的前提条件 
    scanf("%s",c);
    for(int i = 0;i < strlen(c);i++){
        if(c[i] == '('||c[i] == ')'||c[i] == '['||c[i] == ']'||c[i] == '{'||c[i] == '}')
        {
            la=push(la,c[i]);
        }
        k=ifpop(la);
        if(k){
            la->top-=2;
        }
    }
    if(la->top==-1){
        printf("yes
");
    } 
    else{
        printf("no
");
    } 
    return 0;
}

你期待的结果是什么?实际看到的错误信息又是什么?

期待结果:当表达式括号都匹配时输出yes否则输出no


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

应该是出栈判断越界的问题;

int ifpop(pseqstack la)  
{

```
if(la->s[la->top]==')'&&la->s[(la->top)-1]=='('){
    return 1;
}
else if(la->s[la->top]==']'&&la->s[(la->top)-1]=='['){
    return 1;
}
else if(la->s[la->top]=='}'&&la->s[(la->top)-1]=='{'){
    return 1;
}
else return 0;
```

}

的la->top-1 可能为负比如{ ))))) ;这种情况;
第一次
入栈;
la->top=0
判断出栈
la->s[la->top]'&&la->s[(la->top)-1]
la->top -1 数组访问越界就 出问题了,可以加一个判断a->top-1 的值;
还有我不确定

else return 0;

没有匹配,表示匹配不成功吧,
;

可以看看这个我以前写的

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]!='') //退出的条件;
{
       // 左括号进栈;
        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;
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to MLink Developer Q&A Community for programmer and developer-Open, Learning and Share
...