user-0 提问: 大二刚学数据结构，程序有bug求请教

回复:
user: user-1
content: 最后的核心check逻辑就这么几行             char top = gettop(&L);             /*看新进的字符能否关闭掉栈顶*/             if(close_check((unsigned char)top, (unsigned char)c[i]))             {                 pop(&L, &e);             }             else{                 push(&L, c[i]);             }         }

user: user-1
content: 你的check方式让人看不懂，这个就是类似玩消消乐， （）这种括号对，左边的我们管他叫open，右边的我们管他叫close ()是合法的)(则是非法的，只要close能匹配open，我们就消掉他，否则就压栈进去 又比如 [([)] 看起来是匹配的，但是消不掉，， 你自己弄一些例子，然后一步步手工消解下看，就能明白其中思想了  思想是，看看能跟栈顶匹配就消，（不要入栈，入栈前看能不能消），不能消才入栈， 你的逻辑太复杂了，没有一步一步分解开来，  以下是代码，有做简单测试，可行。 有加了一些注释，希望你能看明白 #include<stdio.h> #include<stdlib.h>  #define maxsize 30  typedef char elemtype; typedef struct stack {     elemtype *top;     elemtype *base; 	int size; }sqstack;  void creatstack(sqstack *L) { 	L->base=(char *)malloc(maxsize*sizeof(char)); 	L->top=L->base; 	L->size = maxsize; } void push(sqstack *L,char x) { 	if(L->top-L->base>=L->size) { 		L->base=(char *)realloc(L->base, (L->size+20)*sizeof(char)); 		L->top=L->base+L->size; 		//L->size = L->size+10; 		L->size = L->size + 20; 	} 	*(L->top) = x; 	L->top++;  }  int pop(sqstack *L,char *e) { 	if(L->top==L->base) { 		printf("栈为空\n"); 		return 1; 	} 	L->top--; 	*e=*(L->top);  	return 0; }  /*返回栈顶元素，注意这里不同于pop操作，只是复制一份出来看看  * 如果栈为空，返回'_'  *这个代码是为了匹配用的，虽然返回'_'怪怪的  只要不与哈希表 g_ch_pair中的内容相同就好了  * */ elemtype gettop(sqstack *L) { 	if(L->top == L->base) 		return '_'; 	else 		return *(L->top - 1); }  /*栈是否为空   如果空返回true 否则返回false*/ int empty(sqstack *l) { 	return l->top == l->base; }   char print(sqstack *L) { 	elemtype *p; 	p=L->top; 	return *(p-2); }  /*简单的匹配哈希*/ static char g_ch_pair[256] = {0}; void init_hash() { 	/*这里有一个隐含条件，只有右括号 ｝ ] )才能找到他对应的东西 	 * 右括号习惯上又叫close， 左括号叫open，打开 	 * 类似于开门，关门，，，， 	 * 我们只有在遇到右括号的时候，匹配才有意义， 	 * 所以用左括号来匹配的时候，返回是默认值0, 肯定不允许关闭*/ 	g_ch_pair[(unsigned char)'}'] = '{'; 	g_ch_pair[(unsigned char)']'] = '['; 	g_ch_pair[(unsigned char)')'] = '('; } /*  *右边是后进来的，看后来者是不是能close掉前者  能关闭则返回成功，否则false  比如left = '{', right = '}' 成功  但是 left = '}', right = '{'是失败的，切记，因为'{'是open标志，是不可能用来关闭别人的  * */ int  close_check(unsigned char left, unsigned char right) { 	return (unsigned char)g_ch_pair[right] == left; }  int main() { 	int i=0; 	char e; 	char c[256]; 	elemtype *p,*q; 	sqstack L; 	creatstack(&L); 	p = L.top; 	//q=L->base; 	q = L.base; 	 	init_hash(); 	printf("请输入字符串："); 	scanf("%s",c);  	while(c[i]!='\0') 	{ 		/*输入有效性检查，确保c 只能是三个字符中的一个*/ 		if(c[i] != '{' && c[i] != '(' && c[i] != '[' 			&&c[i] != '}' && c[i] != ')' && c[i] != ']')  		{ 			printf("非法字符串\n"); 			return 0; 		} 		 		/*	 		 *	因为为空的时候 gettop(&L),会返回 '_' 		 *	因此close_check肯定会失败，那么就会走push流程， 		 *	所以这个empty的代码去掉，因为这个条件下，不用这段代码也会执行相同的操作 		if(empty(&L)){ 			push(&L, c[i]); 		} 		else  		*/ 		{ 			char top = gettop(&L); 			/*看新进的字符能否关闭掉栈顶*/ 			if(close_check((unsigned char)top, (unsigned char)c[i])) 			{ 				pop(&L, &e); 			} 			else{ 				push(&L, c[i]); 			} 		} 		i++; 	} 	/*!!!!要赋值,也是在这里赋值 	 *其实更好的方法是调用empty(&L)函数来判断 	 * */ 	p = L.base; 	q = L.top; 	if(p==q) 	{ 		printf("合法字符串\n"); 	} 	else 	{ 		printf("非法字符串\n"); 	} 	return 0; }

user: user-2
content: p = L.top; 	q = L.base;

user: user-3
content: #include<stdio.h> #include<stdlib.h>  #define maxsize 30  typedef char elemtype; typedef struct stack {     elemtype *top;     elemtype *base;     int size; }sqstack;  void creatstack(sqstack *L) {     L->base=(char *)malloc(maxsize*sizeof(char));     L->top=L->base;     L->size = maxsize; } void push(sqstack *L,char x) {     if(L->top-L->base>=L->size) {         L->base=(char *)realloc(L->base, (L->size+20)*sizeof(char));         L->top=L->base+L->size;         //L->size = L->size+10;         L->size = L->size + 20;     }     *(L->top) = x;     L->top++;  }  int pop(sqstack *L,char *e) {     if(L->top==L->base) {         printf("栈为空\n");         return 1;     }     L->top--;     *e=*(L->top);      return 0; }  char print(sqstack *L) {     elemtype *p;     p=L->top;     return *(p-2); } int main() {     int i=0;     char e;     char c[30];     elemtype *p,*q;     sqstack L;     creatstack(&L);     //p=L->top;     p = L.top;     //q=L->base;     q = L.base;     printf("请输入字符串：");     scanf("%s",c);      while(c[i]!='\0')     {         if((c[i]=='['||c[i]=='{'||c[i]=='(')&&(i==0))  //第一个为 [ { (         {             push(&L,c[i]);         }         else if((c[i]==']'||c[i]=='}'||c[i]==')')&&(i==0))//第一个为 ] } )         {             printf("非法字符串\n");             return 1;         }         else if((c[i]=='['||c[i]=='{'||c[i]=='(')&&(i!=0))//第二个为[ {  (         {             if(print(&L)==']'||print(&L)=='}'||print(&L)==')')// ][  }{ )( 情况             {                 printf("非法字符串\n");                 return 1;             } else         {             push(&L,c[i]);  // [[  {{ ((  [{ [(情况         }         }         else //if((c==']'||c=='}'||c==')')&&(i!=0))第二个为 ] } )         {             if((print(&L)=='['&&c[i]==']')||(print(&L)=='{'&&c[i]=='}')||(print(&L)=='('&&c[i]==')')) // [] {} ()情况，若不成立则为 [[             {                 pop(&L,&e);             }             else // ]] }} ))情况             {                 push(&L,c[i]);             }     }     i++;     }     if(p==q)     {         printf("合法字符串\n");     }     } 代码编译通过，供参考～  建议楼主把main函数里的if else关系弄清楚了，并且该加的大括号加上大括号。