user-0 提问: 数据结构—用栈实现括号匹配检验。代码不知道哪里出错了，求助！

回复:
user: user-0
content: 引用 1 楼 自信男孩 的回复:#include <stdio.h> #include <stdlib.h>  #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define ERROR -1 typedef struct{       //定义顺序栈的存储结构     char *base;     char *top;     int stacksize; }SqStack;   void InitStack(SqStack *s) //建空栈 {     s->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));     if(!s->base)         exit(1);     s->top=s->base;     s->stacksize=STACK_INIT_SIZE; }  int GetTop(SqStack *s,char *e) {     if(s->top==s->base) return ERROR;     *e=*(s->top-1);     return 1; }  void push(SqStack *s,char e) {     if((s->top-s->base)>=s->stacksize)  //栈已满，重新分配存储空间     {         s->base=(char*)realloc(s->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(char));         if(!s->base) exit(1);         s->top=s->base+s->stacksize;         s->stacksize+=STACKINCREMENT;     }     *s->top++=e; }  int pop(SqStack *s,char *e) {     if(s->top==s->base) return 0;     *e=*--s->top;     return 1; }  int StackEmpty(SqStack *s) {     if(s->top==s->base) return 1;  //栈空，返回值为1     else return 0; }  int BracketsMatch(SqStack *s,char b[]) {     InitStack(s);     int i=0;     //char *e;     char e;     while(b[i]!='#')     {         switch (b[i])         {             case '(': push(s,b[i]); break;             case '{': push(s,b[i]); break;             case '[': push(s,b[i]); break;             case ')':                       if(StackEmpty(s))  return 0;                       //pop(s, e);                       pop(s, &e);                       if(e != b[i]) return 0;                       break;             case ']':                       if(StackEmpty(s))  return 0;                       //pop(s, e);                       pop(s, &e);                       if(e!=b[i]) return 0;                       break;             case '}':                       if(StackEmpty(s))  return 0;                       //pop(s,e);                       pop(s, &e);                       if(e!=b[i]) return 0;                       break;         }         ++i;     }     if(StackEmpty(s)) return 1; //栈空，则匹配     else return 0;              //否则，不匹配 }  int main() {     SqStack *s;     char b[100],a;     int i=0,j;     do{         printf("请输入一个括号(#为结束字符)：\n");         scanf("%c", &b[i]);         getchar();    //for'\n'         a=b[i];         i++;     }while(a!='#');      s = (SqStack *)malloc(sizeof(*s));     if (!s)         exit(0);     j=BracketsMatch(s,b);     if(j==1) printf("括号匹配！\n");     else printf("括号不匹配！\n");     return 0; } 供参考～  s为没有申请空间，就直接使用结果是未定义的。其他的问题供参考  现在循环语句变成一次输出一遍，一次输出两遍，不知道是为什么 我的其他程序加了getchar()后就好了，但是这个不知道怎么回事？？ 您能帮我再看看吗？？谢谢谢谢！！！   还有就是您最后说的S没有申请空间，直接使用结果是未定义的，是什么意思啊？ 原谅我没太明白。就是GetTop(SqStack S)这类函数因为是读取不进行操作，所以参数一般是定义为S而不是*S， （我的理解），然后程序里SqStack *S，还有InitStack(S）中S都是以指针形式定义的，所以如果在函数中调用 GetTop函数，这个参数我不知道该怎么写，所以我把程序中函数GetTop(SqStack *S）定义为指针了，所以想问一下， 如果GetTop仍定义为GetTop(SqStack S），在函数中应该怎么调用呢，主要是参数怎么写呢？？ 谢谢谢谢！

user: user-1
content: #include <stdio.h> #include <stdlib.h>  #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define ERROR -1 typedef struct{       //定义顺序栈的存储结构     char *base;     char *top;     int stacksize; }SqStack;  void InitStack(SqStack *s) //建空栈 {     s->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));     if(!s->base)         exit(1);     s->top=s->base;     s->stacksize=STACK_INIT_SIZE; }  int GetTop(SqStack *s,char *e) {     if(s->top==s->base) return ERROR;     *e=*(s->top-1);     return 1; }  void push(SqStack *s,char e) {     if((s->top-s->base)>=s->stacksize)  //栈已满，重新分配存储空间     {         s->base=(char*)realloc(s->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(char));         if(!s->base) exit(1);         s->top=s->base+s->stacksize;         s->stacksize+=STACKINCREMENT;     }     *s->top++=e; }  int pop(SqStack *s,char *e) {     if(s->top==s->base) return 0;     *e=*--s->top;     return 1; }  int StackEmpty(SqStack *s) {     if(s->top==s->base) return 1;  //栈空，返回值为1     else return 0; }  int BracketsMatch(SqStack *s,char b[]) {     InitStack(s);     int i=0;     //char *e;     char e;     while(b[i]!='#')     {         switch (b[i])         {             case '(': push(s,b[i]); break;             case '{': push(s,b[i]); break;             case '[': push(s,b[i]); break;             case ')':                       if(StackEmpty(s))  return 0;                       //pop(s, e);                       pop(s, &e);                       if(e != b[i]) return 0;                       break;             case ']':                       if(StackEmpty(s))  return 0;                       //pop(s, e);                       pop(s, &e);                       if(e!=b[i]) return 0;                       break;             case '}':                       if(StackEmpty(s))  return 0;                       //pop(s,e);                       pop(s, &e);                       if(e!=b[i]) return 0;                       break;         }         ++i;     }     if(StackEmpty(s)) return 1; //栈空，则匹配     else return 0;              //否则，不匹配 }  int main() {     SqStack *s;     char b[100],a;     int i=0,j;     do{         printf("请输入一个括号(#为结束字符)：\n");         scanf("%c", &b[i]);         getchar();    //for'\n'         a=b[i];         i++;     }while(a!='#');      s = (SqStack *)malloc(sizeof(*s));     if (!s)         exit(0);     j=BracketsMatch(s,b);     if(j==1) printf("括号匹配！\n");     else printf("括号不匹配！\n");     return 0; } 供参考～  s为没有申请空间，就直接使用结果是未定义的。其他的问题供参考