user-0 提问: 关于栈的问题。为什么Push函数top始终是NULL？

回复:
user: user-1
content: #include<stdio.h> #include<malloc.h> #include<string.h> typedef char elemtype; typedef struct stacknode{     elemtype data;     struct stacknode *next; }StackNode; //建栈 StackNode *InitStack(StackNode *top){                  //你这是在做什么？？？？又申请空间，又复制NULL，你到底想干啥？     top=(StackNode *)malloc(sizeof(StackNode));     top=NULL;     return top; } int Judge(StackNode *top){     if(top==NULL)     {         printf("建栈成功.\n");         return 1;     }     else     {         printf("建栈失败！\n");         return 0;     } } //进栈 int Push(StackNode *top){     StackNode *p,*q;     char *ch = (char*)malloc(sizeof(char)*20);        ///只改了一下先把字符串接收完了，     gets(ch);                                                       ////然后逐一分析，具体你的方法该怎么改还没时间帮你看     while('#' != *ch)     {         if(*ch=='{'||*ch=='('||*ch=='['||*ch=='<')         {             p=(StackNode *)malloc(sizeof(StackNode));//如果是左边的，进栈。             p->next=NULL;             p->data=*ch;             p->next=top;             top=p;         }         if(*ch=='}'||*ch==')'||*ch==']'||*ch=='>')         {             if(top==NULL)             {                 printf("栈空.\n");//如果是右边的且top=NULL栈空，说明不平衡。还有符号没有平衡。                 return 0;             }             else             {                 switch(*ch)                 {                 case '{':if(top->data!='}')//如果是右边的且top！=NULL出栈                              return 0;                     else                         break;                 case '(':if(top->data!=')')                              return 0;                     else                         break;                 case '[':if(top->data!=']')                              return 0;                     else                         break;                 case '<':if(top->data!='>')                              return 0;                     else                         break;                 }                 q=top;                 top=top->next;                 free(q);             }         }         ++ch;     }     if(top==NULL)         return 1;     else         return 0; };   int main(){     StackNode *top = NULL;     int k;     //top=InitStack(top);     Judge(top);     printf("请输入带{} () [] <>的字符的字符串以“#”号键结束:");     k=Push(top);     if(k==1)         printf("符号平衡.\n");     else         printf("符号不平衡.\n");     return 0; }   我去，居然回到你那个帖子上去了

user: user-2
content: StackNode *InitStack(StackNode *top){      top=(StackNode *)malloc(sizeof(StackNode));      top=NULL;      return top;  }  这句话是干嘛的，有问题吧   top=NULL;

user: user-0
content: 引用 2 楼 N_sev7 的回复: #include<stdio.h> #include<malloc.h> #include<string.h> typedef char elemtype; typedef struct stacknode{     elemtype data;     struct stacknode *next; }StackNode; //建栈 StackNode *InitStack(StackNode *top){                  //你这是在做什么？？？？又申请空间，又复制NULL，你到底想干啥？     top=(StackNode *)malloc(sizeof(StackNode));     top=NULL;     return top; } int Judge(StackNode *top){     if(top==NULL)     {         printf("建栈成功.\n");         return 1;     }     else     {         printf("建栈失败！\n");         return 0;     } } //进栈 int Push(StackNode *top){     StackNode *p,*q;     char *ch = (char*)malloc(sizeof(char)*20);        ///只改了一下先把字符串接收完了，     gets(ch);                                                       ////然后逐一分析，具体你的方法该怎么改还没时间帮你看     while('#' != *ch)     {         if(*ch=='{'||*ch=='('||*ch=='['||*ch=='<')         {             p=(StackNode *)malloc(sizeof(StackNode));//如果是左边的，进栈。             p->next=NULL;             p->data=*ch;             p->next=top;             top=p;         }         if(*ch=='}'||*ch==')'||*ch==']'||*ch=='>')         {             if(top==NULL)             {                 printf("栈空.\n");//如果是右边的且top=NULL栈空，说明不平衡。还有符号没有平衡。                 return 0;             }             else             {                 switch(*ch)                 {                 case '{':if(top->data!='}')//如果是右边的且top！=NULL出栈                              return 0;                     else                         break;                 case '(':if(top->data!=')')                              return 0;                     else                         break;                 case '[':if(top->data!=']')                              return 0;                     else                         break;                 case '<':if(top->data!='>')                              return 0;                     else                         break;                 }                 q=top;                 top=top->next;                 free(q);             }         }         ++ch;     }     if(top==NULL)         return 1;     else         return 0; };   int main(){     StackNode *top = NULL;     int k;     //top=InitStack(top);     Judge(top);     printf("请输入带{} () [] <>的字符的字符串以“#”号键结束:");     k=Push(top);     if(k==1)         printf("符号平衡.\n");     else         printf("符号不平衡.\n");     return 0; }   我去，居然回到你那个帖子上去了   谢谢！我的方法我改过来了，不过你的我没懂啊。char *ch = (char*)malloc(sizeof(char)*20);      gets(ch);是什么意思啊？还有我的那个StackNode *InitStack(StackNode *top)是不是也没用，只需要将top=NULL，就可以了？是吗？