回 帖 发 新 帖 刷新版面

主题:[原创]关于括弧匹配的问题,我的源程序,还有些我的个人理解

#include<stdio.h>
#define TRue 1
#define ERror 0
#define maxsize 100

typedef struct
{ char a[100];
  int top;
}stack;

/*stack *s;*/
initstack(stack *s)
{s->top=0;}

int emptystack(stack s)
 {if(s.top==0) return 1;
  else return 0;}

char get_top(stack s)
 {if(s.top==0) return 0;
  else
      return s.a[s.top-1];
}

push(stack *s,char ch)
 {
  if((s->top)==maxsize )
     {printf("栈已满,不能插入"); return 0;}
  s->a[s->top]=ch;
  s->top++;
}

pop(stack *s)
 {
  if(s->top==0) {printf("栈是空的,不能删除");return 0;}
  s->top--;
 }

int match_kuohao(char c[])
 {   int i=0;
   stack s;

   initstack(&s);
   while(c[i]!='#')
   {
     /* if(c[i]!='['||c[i]!=']'||c[i]!='('||c[i]!=')'||c[i]!='{'||c[i]!='}')
       return 0; */
     switch(c[i])
     {
       case '{':
       case '[':  
       case '(':push(&s,c[i]);break;
       case '}':if(!emptystack(s)&&get_top(s)=='{')
               {pop(&s);break;}
                 else return 0;
       case ']':if(!emptystack(s)&&get_top(s)=='[')
              {pop(&s);break;}          else return 0;
       case ')':if(!emptystack(s)&&get_top(s)=='(')
              {pop(&s);break;}          else return 0;
     }
     i++;
   }
   return (emptystack(s));/*栈空则匹配,否则不匹配*/
 }                            

main()
{char  c[maxsize];
 int j;
 printf("please input the string:\n");
 gets(c);
 j=match_kuohao(c);
 if(j) printf("they are match\n");
 else printf("not match\n");
 getch();
}在WIN-TC下调试通过
 
我在论坛中也看到了些相关的括弧匹配的程序,作者说调试通过了,
可为什么我复制在WIN-TC环境中编译不能通过呢,请指点谢谢。还有就是我觉得有些朋友的程序
好象有点缺陷,就是没有考虑没括弧的情况。不知道我的理解是不是对的,请指点。

回复列表 (共6个回复)

沙发

恩,
应该是编译器的问题
有些函数tc里面没有
具体我也不太懂,
楼主你可以试试vc或者vs2005
另外,楼主说的应该是对的
应该考虑不存在括号的问题,如果不存在括号printf("error\n");

板凳

为什么发两条重复的?

3 楼

没人回答呀

4 楼

没有括号?那还用匹配么?没有括号的话直接就return OK了

5 楼

#include <stdlib.h>
#include <stdio.h>

#define ERROR 0
#define OK 1
#define INFEASIBLE -1
#define NULL 0
#define OVERFLOW -2
#define STACK_INIT_SIZE 5
#define STACKINCREMENT 3

typedef char SElemType;
typedef int Status;
typedef struct{            //定义
    SElemType *base,*top;
    int stacksize;
}SqStack;

Status InitStack(SqStack &S){
    if(!(S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)))) return OVERFLOW;
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
}

Status Push(SqStack &S,char x){
    if(S.top-S.base>=S.stacksize){
        if(!(S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)))) return OVERFLOW;
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
    }
    *S.top++=x;    
    return OK;
}

Status Pop(SqStack &S,char &x){
    if(S.top==S.base) return ERROR;
    else    x=*(--S.top);
    return OK;
}

Status Done(SqStack &S){
    char a[]="(S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType))))";
    char *p,c;
    p=a;
    while(*p!='\0'){
        if(*p=='('||*p=='['||*p=='{')    Push(S,*p);
        else{
            if(*p==')'||*p==']'||*p=='}'){
                if(S.top==S.base) return ERROR;
                Pop(S,c);
                if(c!='('&&*p==')')    return ERROR;
                if(c!='['&&*p==']')    return ERROR;
                if(c!='{'&&*p=='}')    return ERROR;
            }
        }
        p++;
    }
    if(S.top!=S.base) return ERROR;
    return OK;
}

void main(){
    SqStack S;
    InitStack(S);
    if(Done(S)) printf("\nYES\n");
    else printf("\nNO\n");
}

这是我参考了某书答案后写的,在Done(SqStack &S)里面处理,在VC++上通过,对与没有括号的情况,是直接跳过,到return OK,没有括号,就表示匹配成功,请指教。

6 楼


如果没有括弧,就说明不匹配啊。不能没有括弧就跳过,我们是判断它是否匹配,所以对没一种情况都要考虑,都要判断。
“对与没有括号的情况,是直接跳过,到return OK,没有括号,就表示匹配成功”你的这种做法,不仅少了一种情况,而且有点错误。错在“没有括号,就表示匹配成”连括弧都没有,哪来的匹配成功啊。

我来回复

您尚未登录,请登录后再回复。点此登录或注册