user-0 提问: 求高手看看，C语言，判断式子里的圆括号是否配对，利用链栈方法，遇到‘（’进栈，遇到‘）’出栈，最后判断‘（’栈中是否是空，空则对称，但一直运行不出，快疯了！！

回复:
user: user-1
content: #include＜stdio.h＞   #include＜stdlib.h＞   typedef struct node { 	char ch;   	 struct node *next; }linkstack;   int judgeemply(linkstack *s ) {     	if (s-＞next==NULL)            	return 1; 	else 	    return 0; }   linkstack *setstack() {     	 linkstack *s;     	 s=(linkstack*)malloc (sizeof (linkstack));      	 s-＞next=NULL;      	return s; }   	linkstack *pushu(linkstack *s,char  a) {    	 linkstack *p;     	p=(linkstack*)malloc(sizeof (linkstack));     	       p-＞ch=a;           p-＞next=s;       s=p;           return s; }          linkstack *popstack(linkstack *s) {           linkstack *p;           p=s;       s=s-＞next;       free(p);          return s; }     void Judgepair(linkstack *s) { 	char c;           linkstack *p;           p=(linkstack*)malloc(sizeof (linkstack));       printf("Please input ico fanishi '#'\n");           c=getchar();           while (c!='#')          {               switch(c)     {           case'(':                   p=pushu(p,c);                break;        case')':                {                        if (judgeemply(p))                     {             	printf("YES\n");         	}                 	  else       	      p=popstack(p);                 }          }              c=getchar();          } 	if (judgeemply(p))            	  printf("YES\n");          else             printf("NO\n"); }    int main() { 	linkstack *p;         p=setstack();        Judgepair(p);    return 0; }

user: user-0
content: 引用 5 楼 iamyuqy的回复:这个问题的原题应该不是必须采用堆栈方法吧，很多公司的中初级程序员都会考这道题，直接使用一个变量是不是就能很快的搞定了，遇到 ‘(’ 加一，遇到 ‘)’ 减一，while循环中如果发现数字被减翻的时候退出当前循环，最后检查如果该变量不是0返回错误就行了。 谢谢提醒 但题目要求是用栈

user: user-2
content: 这个问题的原题应该不是必须采用堆栈方法吧，很多公司的中初级程序员都会考这道题，直接使用一个变量是不是就能很快的搞定了，遇到 ‘(’ 加一，遇到 ‘)’ 减一，while循环中如果发现数字被减翻的时候退出当前循环，最后检查如果该变量不是0返回错误就行了。

user: user-3
content: 仅供参考：#include<stdio.h> #include<malloc.h> #include<string.h> #define STACK_INIT_SIZE 10 #define STACK_GROW_SIZE 5 #define ELEMTYPE char #define OK 1 #define ERROR 0 typedef struct { /*建立一个栈的首结点*/     ELEMTYPE * base;     ELEMTYPE * top;     int stacksize; } SpStack; int InitStack(SpStack *s) { /*建立空的栈并返回首地址*/     s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE)));     if (!s->base) return ERROR;     s->top=s->base;     s->stacksize=STACK_INIT_SIZE;     return OK; } int StackEmpty(SpStack *s) { /*判断栈是否为空*/     if (s->top==s->base) return OK;     else                 return ERROR; } int Push(SpStack *s,ELEMTYPE e) { /*往栈顶插入元素即进栈*/     if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/         s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE)));         if (!s->base) return ERROR;         s->stacksize+=STACK_GROW_SIZE;         s->top=s->base+s->stacksize;     }     *s->top++=e;     return OK; } int Pop(SpStack *s,ELEMTYPE *e) { /*让栈顶元素依次输出即出栈*/     if (StackEmpty(s)) return ERROR;     *e=*(--s->top);     return OK; } int Comp(ELEMTYPE a,ELEMTYPE b) {     if ((a=='('&&b!=')')       ||(a=='['&&b!=']')       ||(a=='{'&&b!='}')) {         return ERROR;     } else return OK; } int Count(SpStack *s) {     ELEMTYPE e[STACK_INIT_SIZE*2];     ELEMTYPE e1;     int i;      InitStack(s);     fgets(e,STACK_INIT_SIZE*2,stdin);     if ('\n'==e[strlen(e)-1]) e[strlen(e)-1]=0;     printf("%s\n",e);     for (i=0;e[i]!='\0';i++) {         switch (e[i]) {         case '(':         case '[':         case '{':             Push(s,e[i]);             break;         case ')':         case ']':         case '}':             if (StackEmpty(s)) {                 printf("%*s↖右括号多余\n",i+1,"");                 return(ERROR);             } else Pop(s,&e1);             if (!Comp(e1,e[i])) {                 printf("%*s↖左右匹配出错\n",i+1,"");                 return(ERROR);             }         }     }     if (!StackEmpty(s)) {         printf("%*s↖左括号多余\n",i,"");         return(ERROR);     } else {         printf("匹配正确\n");         return(OK);     } } void main() {     SpStack s;     Count(&s);     free(s.base); }

user: user-0
content: 非常感谢大家的慷慨帮助，我是计算机专业的，但感觉编程有点吃力，可又不想白白浪费大学时光，所以我把程序发上来，希望能得到大神们的指点。 我现在 又改了思路，我的思路是这样的，扫描输入的字符，当发现“（”时把其输入栈p中，“（”都入栈后，再扫描“）”，发现一个“）”就把栈p里的“（”出栈，再扫描“）”之前要判断栈p是否为空，若为空，breeak结束扫描，因为一个左括号配对一个右括号，所以我给扫描这两个括号各一个计算器i和j，最后判断p是否为空且i与j是否相等，若满足，就是对称的，若不满足就是不对称的。代码如下，但都是只输出YES, #include<stdio.h> #include<stdlib.h> typedef struct node{     char ch;     struct node *next; }linkstack; int judgeemply(linkstack *s) {     if (s->next == NULL)         return 1;     else         return -1; } linkstack *setstack() {     linkstack *s;     s = (linkstack*)malloc(sizeof(linkstack));     s->next = NULL;     return s; } linkstack *pushu(linkstack *s, char a) {     linkstack *p;     p = (linkstack*)malloc(sizeof(linkstack));     p->ch = a;     p->next = s->next;     s->next = p;     return s; } linkstack *popstack(linkstack *s) {      linkstack *p;     p = s->next;     s->next = p->next;     free(p);     return s;  } void Judgepair(linkstack *p) {     char c;int i=0,j=0;    // linkstack *p = (linkstack*)malloc(sizeof(linkstack));     printf("Please input ico fanishi '#'\n");     c = getchar();     while (c != '#')     {         switch (c){         case'(':            {                p = pushu(p, c);                i++;             break;            }         case')':         {                    j++;                    if (judgeemply(p))                           break;                    else                        p = popstack(p);         }         }         c = getchar();     }     if (judgeemply(p))         printf("YES\n");     else         printf("NO\n"); } void main() {     linkstack *p;     p = setstack();     Judgepair(p); } 可能我的代码很白痴，希望能得到大神们的指点指点，谢谢谢谢

user: user-4
content: 错误是由于你的Judgepair函数里linkstack *p;没有初始化引起的，应该改成linkstack *p = (linkstack*)malloc(sizeof(linkstack)); 而且你的逻辑我也不是很看的懂，最好学会自己单步调试 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  #include<stdio.h> #include<stdlib.h> typedef struct node{ 	char ch; 	struct node *next; }linkstack; int judgeemply(linkstack *s) { 	if (s->next == NULL) 		return 1; 	else 		return -1; } linkstack *setstack() { 	linkstack *s; 	s = (linkstack*)malloc(sizeof(linkstack)); 	s->next = NULL; 	return s; } linkstack *pushu(linkstack *s, char a) { 	linkstack *p; 	p = (linkstack*)malloc(sizeof(linkstack)); 	p->ch = a; 	p->next = s->next; 	s->next = p; 	return s; } linkstack *popstack(linkstack *s) { 	linkstack *p; 	p = s->next; 	s->next = p->next; 	free(p); 	return s; } void Judgepair(linkstack *s) { 	char c; 	linkstack *p = (linkstack*)malloc(sizeof(linkstack)); 	printf("Please input ico fanishi '#'\n"); 	c = getchar(); 	while (c != '#') 	{ 		switch (c){ 		case'(': 			p = pushu(p, c); 			break; 		case')': 		{ 				   if (judgeemply(p)) 				   { 					   printf("NO\n"); 				   } 				   else 					   p = popstack(p); 		} 		} 		c = getchar(); 	}if (judgeemply(p)) 		printf("YES\n"); 	else 		printf("NO\n"); } void main() { 	linkstack *p; 	p = setstack(); 	Judgepair(p); }

user: user-5
content: if(judgeemply(p)) 这句里的p可能会出现没初始就使用的情况