user-0 提问: 栈检验括号序列，用文件

回复:
user: user-1
content: 12楼还建议要删除以下行: s.top=s.base+s.stacksize;  否则出错.可用以下测试用例验证: (((((((((((((((((((((((((((((((((((((((((((((((((())))))))))))))))))))))))))))))))))))))))))))))))))

user: user-1
content: 虽然LZ已结帖,但函数Push的错误不只是少了括号. 以下行有错: s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 第一次执行以上语句后s.base指向增大为INITSTACKSIZE+INCREMENT的内存,但以后再执行以上语句s.base指向的内存没有增大. 可用以下测试用例来暴露这个错误: (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((([[[[[  12楼建议把此行改为: s.base=(char*)realloc(s.base,(s.stacksize+INCREMENT)*sizeof(char));  另外,INCREMENT定义为10不够存放一个结构Stack,至少应改为: #define INCREMENT sizeof(Stack)

user: user-2
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: 我在入栈函数处if语句少了括号，谢谢大家提醒。void Push(Stack &s,char c) { 	if((s.top-s.base)>=s.stacksize) 	{ 		s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 	if(!s.base) 		exit(0); 	s.top=s.base+s.stacksize; 	s.stacksize+=INCREMENT; 	} 	*s.top++=c; }

user: user-1
content: LZ程序只要修改Push函数即可： void Push(Stack &s,char c) {   if((s.top-s.base)>=s.stacksize)   {     s.base=(char*)realloc(s.base,(s.stacksize+INCREMENT)*sizeof(char));//改 s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char));     s.stacksize+=INCREMENT;   }   if(!s.base)     exit(0);   //删 s.top=s.base+s.stacksize;   //删 s.stacksize+=INCREMENT;   *s.top++=c; }

user: user-3
content: 如我在10楼的答案，栈的结构不正确，另外楼掉了一个p++。  引用 7 楼 user-4 的回复:帮你改了，记得给分。 #define INITSTACKSIZE 50 #define INCREMENT 10 #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct { //	char *top; 	char *base; 	unsigned int count;//元素个数 	unsigned int stacksize;//内存空间 }Stack; void Push(Stack &s,char c) { 	if(/*(s.top-s.base)*/s.count>=s.stacksize) 	{ 		s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 		if(!s.base) 			exit(0); 		s.stacksize+=INCREMENT; 	} //	s.top=s.base+s.stacksize;  	*(s.base+s.count) = c; 	s.count ++; //	*s.top++=c; } bool Pop(Stack &s,char &c) { //	if(s.top==s.base) //		exit(0); 	if(s.count == 0) 		return false; 	c = *(s.base+s.count-1); 	s.count --; //	c=*--s.top; 	return true; } int StackEmpty(Stack s) { //	if(s.top==s.base) 	if(s.count == 0) 		return 1; 	else 		return 0; } void InitStack(Stack &a) { 	a.base=(char*)malloc(INITSTACKSIZE*sizeof(char)); 	if(!a.base) 	{ 		printf("分配空间失败!\n"); 		exit(-1); 	} 	a.count = 0; //	a.top=a.base; 	a.stacksize=INITSTACKSIZE; } int main() {    	FILE *fp; 	Stack s; 	char a[100],b[100],e; 	char *p; 	printf("请输入您要读取的文件名:\n"); 	gets(a); 	fp=fopen(a,"r"); 	if(fp==NULL) 	{ 		printf("打开文件失败!\n"); 		exit(0); 	} 	else 	{ 		printf("文件打开成功!\n"); 	} 		fscanf(fp,"%s",b); 	fclose(fp); puts(b); 	InitStack(s); 	p=b;  while(*p) // 没到串尾      switch(*p)      {        case '(':        case '[':        case '{':Push(s,*p++); // 左括号入栈，且p++                 break;        case ')':        case ']':        case '}':if(!StackEmpty(s)) // 栈不空                 {                   Pop(s,e); // 弹出栈顶元素                   if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))                   { // 出现3种匹配情况之外的情况                     printf("左右括号不配对\n");                     exit(0);                   }                 }                 else // 栈空                 {                   printf("缺乏左括号\n");                   exit(0);                 }        default: p++; // 其它字符不处理，指针向后移      }    if(StackEmpty(s)) // 字符串结束时栈空      printf("括号匹配\n");    else      printf("缺乏右括号\n"); 	 	return 0; }

user: user-3
content: #define INITSTACKSIZE 50 #define INCREMENT 10 #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct { 	char *top; 	char *base; 	int stacksize; }Stack; void Push(Stack &s,char c) { 	*s.top++=c; } void Pop(Stack &s,char &c) { 	c=*--s.top; } int StackEmpty(Stack s) { 	if(s.top==s.base) 		return 1; 	else 		return 0; } void InitStack(Stack &a) { 	a.base=(char*)malloc(INITSTACKSIZE*sizeof(char)); 	if(!a.base) 	{ 		printf("分配空间失败!\n"); 		exit(-1); 	} 	a.top=a.base; 	a.stacksize=INITSTACKSIZE; } int main() {    	FILE *fp; 	Stack s; 	char a[100],b[100],e; 	char *p; 	printf("请输入您要读取的文件名:\n"); 	gets(a); 	fp=fopen(a,"r"); 	if(fp==NULL) 	{ 		printf("打开文件失败!\n"); 		exit(0); 	} 	else 	{ 		printf("文件打开成功!\n"); 	} 		fscanf(fp,"%s",b); 	fclose(fp); puts(b); 	InitStack(s); 	p=b;  while(*p) // 没到串尾      switch(*p)      {        case '(':        case '[':        case '{':Push(s,*p++); // 左括号入栈，且p++                 break;        case ')':        case ']':        case '}':if(!StackEmpty(s)) // 栈不空                 {                   Pop(s,e); // 弹出栈顶元素                   if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))                   { // 出现3种匹配情况之外的情况                     printf("左右括号不配对\n");                     exit(0);                   } 		  p++;                 }                 else // 栈空                 {                   printf("缺乏左括号\n");                   exit(0);                 } 		break;        default: p++;break; // 其它字符不处理，指针向后移      }    if(StackEmpty(s)) // 字符串结束时栈空      printf("括号匹配\n");    else      printf("缺乏右括号\n"); 	 	return 0; }

user: user-3
content: 初步查看是你的stack数据结构有问题，第二次pop的时候直接输出的是字符'\0'  引用 6 楼 u013133423 的回复:[quote=引用 5 楼 turingo 的回复:] 你的文件内容是：  {[()[()]]  确实是右边少了一个}  [quote=引用 4 楼 u013133423 的回复:] [quote=引用 3 楼 turingo 的回复:] 直接编译你所贴的代码就有不少错误，先逐条修正好，再看逻辑部分。  [quote=引用 2 楼 u013133423 的回复:] [quote=引用 1 楼 turingo 的回复:] 可否先把语法错误都改好？  [quote=引用 楼主 u013133423 的回复:] 请帮我改代码，不要只说大概，为什么打开内容为“{[()[()]]”的“xxx.txt”文件，程序显示“括号不匹配！”，应该为“缺乏右括号啊”#define INITSTACKSIZE 50 #define INCREMENT 10 #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct { 	char *top; 	char *base; 	int stacksize; }Stack; void Push(Stack &s,char c) { 	if((s.top-s.base)>=s.stacksize) 		s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 	if(!s.base) 		exit(0); 	s.top=s.base+s.stacksize; 	s.stacksize+=INCREMENT; 	*s.top++=c; } void Pop(Stack &s,char &c) { 	if(s.top==s.base) 		exit(0); 	c=*--s.top; } int StackEmpty(Stack s) { 	if(s.top==s.base) 		return 1; 	else 		return 0; } void InitStack(Stack &a) { 	a.base=(char*)malloc(INITSTACKSIZE*sizeof(char)); 	if(!a.base) 	{ 		printf("分配空间失败!\n"); 		exit(-1); 	} 	a.top=a.base; 	a.stacksize=INITSTACKSIZE; } int main() {    	FILE *fp; 	Stack s; 	char a[100],b[100],e; 	char *p; 	printf("请输入您要读取的文件名:\n"); 	gets(a); 	fp=fopen(a,"r"); 	if(fp==NULL) 	{ 		printf("打开文件失败!\n"); 		exit(0); 	} 	else 	{ 		printf("文件打开成功!\n"); 	} 		fscanf(fp,"%s",b); 	fclose(fp); puts(b); 	InitStack(s); 	p=b;  while(*p) // 没到串尾      switch(*p)      {        case '(':        case '[':        case '{':Push(s,*p++); // 左括号入栈，且p++                 break;        case ')':        case ']':        case '}':if(!StackEmpty(s)) // 栈不空                 {                   Pop(s,e); // 弹出栈顶元素                   if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))                   { // 出现3种匹配情况之外的情况                     printf("左右括号不配对\n");                     exit(0);                   }                 }                 else // 栈空                 {                   printf("缺乏左括号\n");                   exit(0);                 }        default: p++; // 其它字符不处理，指针向后移      }    if(StackEmpty(s)) // 字符串结束时栈空      printf("括号匹配\n");    else      printf("缺乏右括号\n"); 	 	return 0; }  [/quote]看不出来哪里错啦！[/quote][/quote]我编译时没错啊，你运行之前先建立一个文件，然后用程序打开文件啊[/quote][/quote]就是要“{[()[()]]”，看图，显示不对啊[/quote]

user: user-4
content: 堆栈指针运算错误。在push的时候。

user: user-4
content: 帮你改了，记得给分。 #define INITSTACKSIZE 50 #define INCREMENT 10 #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct { //	char *top; 	char *base; 	unsigned int count;//元素个数 	unsigned int stacksize;//内存空间 }Stack; void Push(Stack &s,char c) { 	if(/*(s.top-s.base)*/s.count>=s.stacksize) 	{ 		s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 		if(!s.base) 			exit(0); 		s.stacksize+=INCREMENT; 	} //	s.top=s.base+s.stacksize;  	*(s.base+s.count) = c; 	s.count ++; //	*s.top++=c; } bool Pop(Stack &s,char &c) { //	if(s.top==s.base) //		exit(0); 	if(s.count == 0) 		return false; 	c = *(s.base+s.count-1); 	s.count --; //	c=*--s.top; 	return true; } int StackEmpty(Stack s) { //	if(s.top==s.base) 	if(s.count == 0) 		return 1; 	else 		return 0; } void InitStack(Stack &a) { 	a.base=(char*)malloc(INITSTACKSIZE*sizeof(char)); 	if(!a.base) 	{ 		printf("分配空间失败!\n"); 		exit(-1); 	} 	a.count = 0; //	a.top=a.base; 	a.stacksize=INITSTACKSIZE; } int main() {    	FILE *fp; 	Stack s; 	char a[100],b[100],e; 	char *p; 	printf("请输入您要读取的文件名:\n"); 	gets(a); 	fp=fopen(a,"r"); 	if(fp==NULL) 	{ 		printf("打开文件失败!\n"); 		exit(0); 	} 	else 	{ 		printf("文件打开成功!\n"); 	} 		fscanf(fp,"%s",b); 	fclose(fp); puts(b); 	InitStack(s); 	p=b;  while(*p) // 没到串尾      switch(*p)      {        case '(':        case '[':        case '{':Push(s,*p++); // 左括号入栈，且p++                 break;        case ')':        case ']':        case '}':if(!StackEmpty(s)) // 栈不空                 {                   Pop(s,e); // 弹出栈顶元素                   if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))                   { // 出现3种匹配情况之外的情况                     printf("左右括号不配对\n");                     exit(0);                   }                 }                 else // 栈空                 {                   printf("缺乏左括号\n");                   exit(0);                 }        default: p++; // 其它字符不处理，指针向后移      }    if(StackEmpty(s)) // 字符串结束时栈空      printf("括号匹配\n");    else      printf("缺乏右括号\n"); 	 	return 0; }

user: user-0
content: 引用 5 楼 turingo 的回复:你的文件内容是：  {[()[()]]  确实是右边少了一个}  [quote=引用 4 楼 u013133423 的回复:] [quote=引用 3 楼 turingo 的回复:] 直接编译你所贴的代码就有不少错误，先逐条修正好，再看逻辑部分。  [quote=引用 2 楼 u013133423 的回复:] [quote=引用 1 楼 turingo 的回复:] 可否先把语法错误都改好？  [quote=引用 楼主 u013133423 的回复:] 请帮我改代码，不要只说大概，为什么打开内容为“{[()[()]]”的“xxx.txt”文件，程序显示“括号不匹配！”，应该为“缺乏右括号啊”#define INITSTACKSIZE 50 #define INCREMENT 10 #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct { 	char *top; 	char *base; 	int stacksize; }Stack; void Push(Stack &s,char c) { 	if((s.top-s.base)>=s.stacksize) 		s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 	if(!s.base) 		exit(0); 	s.top=s.base+s.stacksize; 	s.stacksize+=INCREMENT; 	*s.top++=c; } void Pop(Stack &s,char &c) { 	if(s.top==s.base) 		exit(0); 	c=*--s.top; } int StackEmpty(Stack s) { 	if(s.top==s.base) 		return 1; 	else 		return 0; } void InitStack(Stack &a) { 	a.base=(char*)malloc(INITSTACKSIZE*sizeof(char)); 	if(!a.base) 	{ 		printf("分配空间失败!\n"); 		exit(-1); 	} 	a.top=a.base; 	a.stacksize=INITSTACKSIZE; } int main() {    	FILE *fp; 	Stack s; 	char a[100],b[100],e; 	char *p; 	printf("请输入您要读取的文件名:\n"); 	gets(a); 	fp=fopen(a,"r"); 	if(fp==NULL) 	{ 		printf("打开文件失败!\n"); 		exit(0); 	} 	else 	{ 		printf("文件打开成功!\n"); 	} 		fscanf(fp,"%s",b); 	fclose(fp); puts(b); 	InitStack(s); 	p=b;  while(*p) // 没到串尾      switch(*p)      {        case '(':        case '[':        case '{':Push(s,*p++); // 左括号入栈，且p++                 break;        case ')':        case ']':        case '}':if(!StackEmpty(s)) // 栈不空                 {                   Pop(s,e); // 弹出栈顶元素                   if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))                   { // 出现3种匹配情况之外的情况                     printf("左右括号不配对\n");                     exit(0);                   }                 }                 else // 栈空                 {                   printf("缺乏左括号\n");                   exit(0);                 }        default: p++; // 其它字符不处理，指针向后移      }    if(StackEmpty(s)) // 字符串结束时栈空      printf("括号匹配\n");    else      printf("缺乏右括号\n"); 	 	return 0; }  [/quote]看不出来哪里错啦！[/quote][/quote]我编译时没错啊，你运行之前先建立一个文件，然后用程序打开文件啊[/quote][/quote]就是要“{[()[()]]”，看图，显示不对啊

user: user-3
content: 你的文件内容是：  {[()[()]]  确实是右边少了一个}  引用 4 楼 u013133423 的回复:[quote=引用 3 楼 turingo 的回复:] 直接编译你所贴的代码就有不少错误，先逐条修正好，再看逻辑部分。  [quote=引用 2 楼 u013133423 的回复:] [quote=引用 1 楼 turingo 的回复:] 可否先把语法错误都改好？  [quote=引用 楼主 u013133423 的回复:] 请帮我改代码，不要只说大概，为什么打开内容为“{[()[()]]”的“xxx.txt”文件，程序显示“括号不匹配！”，应该为“缺乏右括号啊”#define INITSTACKSIZE 50 #define INCREMENT 10 #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct { 	char *top; 	char *base; 	int stacksize; }Stack; void Push(Stack &s,char c) { 	if((s.top-s.base)>=s.stacksize) 		s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 	if(!s.base) 		exit(0); 	s.top=s.base+s.stacksize; 	s.stacksize+=INCREMENT; 	*s.top++=c; } void Pop(Stack &s,char &c) { 	if(s.top==s.base) 		exit(0); 	c=*--s.top; } int StackEmpty(Stack s) { 	if(s.top==s.base) 		return 1; 	else 		return 0; } void InitStack(Stack &a) { 	a.base=(char*)malloc(INITSTACKSIZE*sizeof(char)); 	if(!a.base) 	{ 		printf("分配空间失败!\n"); 		exit(-1); 	} 	a.top=a.base; 	a.stacksize=INITSTACKSIZE; } int main() {    	FILE *fp; 	Stack s; 	char a[100],b[100],e; 	char *p; 	printf("请输入您要读取的文件名:\n"); 	gets(a); 	fp=fopen(a,"r"); 	if(fp==NULL) 	{ 		printf("打开文件失败!\n"); 		exit(0); 	} 	else 	{ 		printf("文件打开成功!\n"); 	} 		fscanf(fp,"%s",b); 	fclose(fp); puts(b); 	InitStack(s); 	p=b;  while(*p) // 没到串尾      switch(*p)      {        case '(':        case '[':        case '{':Push(s,*p++); // 左括号入栈，且p++                 break;        case ')':        case ']':        case '}':if(!StackEmpty(s)) // 栈不空                 {                   Pop(s,e); // 弹出栈顶元素                   if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))                   { // 出现3种匹配情况之外的情况                     printf("左右括号不配对\n");                     exit(0);                   }                 }                 else // 栈空                 {                   printf("缺乏左括号\n");                   exit(0);                 }        default: p++; // 其它字符不处理，指针向后移      }    if(StackEmpty(s)) // 字符串结束时栈空      printf("括号匹配\n");    else      printf("缺乏右括号\n"); 	 	return 0; }  [/quote]看不出来哪里错啦！[/quote][/quote]我编译时没错啊，你运行之前先建立一个文件，然后用程序打开文件啊[/quote]

user: user-0
content: 引用 3 楼 turingo 的回复:直接编译你所贴的代码就有不少错误，先逐条修正好，再看逻辑部分。  [quote=引用 2 楼 u013133423 的回复:] [quote=引用 1 楼 turingo 的回复:] 可否先把语法错误都改好？  [quote=引用 楼主 u013133423 的回复:] 请帮我改代码，不要只说大概，为什么打开内容为“{[()[()]]”的“xxx.txt”文件，程序显示“括号不匹配！”，应该为“缺乏右括号啊”#define INITSTACKSIZE 50 #define INCREMENT 10 #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct { 	char *top; 	char *base; 	int stacksize; }Stack; void Push(Stack &s,char c) { 	if((s.top-s.base)>=s.stacksize) 		s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 	if(!s.base) 		exit(0); 	s.top=s.base+s.stacksize; 	s.stacksize+=INCREMENT; 	*s.top++=c; } void Pop(Stack &s,char &c) { 	if(s.top==s.base) 		exit(0); 	c=*--s.top; } int StackEmpty(Stack s) { 	if(s.top==s.base) 		return 1; 	else 		return 0; } void InitStack(Stack &a) { 	a.base=(char*)malloc(INITSTACKSIZE*sizeof(char)); 	if(!a.base) 	{ 		printf("分配空间失败!\n"); 		exit(-1); 	} 	a.top=a.base; 	a.stacksize=INITSTACKSIZE; } int main() {    	FILE *fp; 	Stack s; 	char a[100],b[100],e; 	char *p; 	printf("请输入您要读取的文件名:\n"); 	gets(a); 	fp=fopen(a,"r"); 	if(fp==NULL) 	{ 		printf("打开文件失败!\n"); 		exit(0); 	} 	else 	{ 		printf("文件打开成功!\n"); 	} 		fscanf(fp,"%s",b); 	fclose(fp); puts(b); 	InitStack(s); 	p=b;  while(*p) // 没到串尾      switch(*p)      {        case '(':        case '[':        case '{':Push(s,*p++); // 左括号入栈，且p++                 break;        case ')':        case ']':        case '}':if(!StackEmpty(s)) // 栈不空                 {                   Pop(s,e); // 弹出栈顶元素                   if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))                   { // 出现3种匹配情况之外的情况                     printf("左右括号不配对\n");                     exit(0);                   }                 }                 else // 栈空                 {                   printf("缺乏左括号\n");                   exit(0);                 }        default: p++; // 其它字符不处理，指针向后移      }    if(StackEmpty(s)) // 字符串结束时栈空      printf("括号匹配\n");    else      printf("缺乏右括号\n"); 	 	return 0; }  [/quote]看不出来哪里错啦！[/quote][/quote]我编译时没错啊，你运行之前先建立一个文件，然后用程序打开文件啊

user: user-3
content: 直接编译你所贴的代码就有不少错误，先逐条修正好，再看逻辑部分。  引用 2 楼 u013133423 的回复:[quote=引用 1 楼 turingo 的回复:] 可否先把语法错误都改好？  [quote=引用 楼主 u013133423 的回复:] 请帮我改代码，不要只说大概，为什么打开内容为“{[()[()]]”的“xxx.txt”文件，程序显示“括号不匹配！”，应该为“缺乏右括号啊”#define INITSTACKSIZE 50 #define INCREMENT 10 #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct { 	char *top; 	char *base; 	int stacksize; }Stack; void Push(Stack &s,char c) { 	if((s.top-s.base)>=s.stacksize) 		s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 	if(!s.base) 		exit(0); 	s.top=s.base+s.stacksize; 	s.stacksize+=INCREMENT; 	*s.top++=c; } void Pop(Stack &s,char &c) { 	if(s.top==s.base) 		exit(0); 	c=*--s.top; } int StackEmpty(Stack s) { 	if(s.top==s.base) 		return 1; 	else 		return 0; } void InitStack(Stack &a) { 	a.base=(char*)malloc(INITSTACKSIZE*sizeof(char)); 	if(!a.base) 	{ 		printf("分配空间失败!\n"); 		exit(-1); 	} 	a.top=a.base; 	a.stacksize=INITSTACKSIZE; } int main() {    	FILE *fp; 	Stack s; 	char a[100],b[100],e; 	char *p; 	printf("请输入您要读取的文件名:\n"); 	gets(a); 	fp=fopen(a,"r"); 	if(fp==NULL) 	{ 		printf("打开文件失败!\n"); 		exit(0); 	} 	else 	{ 		printf("文件打开成功!\n"); 	} 		fscanf(fp,"%s",b); 	fclose(fp); puts(b); 	InitStack(s); 	p=b;  while(*p) // 没到串尾      switch(*p)      {        case '(':        case '[':        case '{':Push(s,*p++); // 左括号入栈，且p++                 break;        case ')':        case ']':        case '}':if(!StackEmpty(s)) // 栈不空                 {                   Pop(s,e); // 弹出栈顶元素                   if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))                   { // 出现3种匹配情况之外的情况                     printf("左右括号不配对\n");                     exit(0);                   }                 }                 else // 栈空                 {                   printf("缺乏左括号\n");                   exit(0);                 }        default: p++; // 其它字符不处理，指针向后移      }    if(StackEmpty(s)) // 字符串结束时栈空      printf("括号匹配\n");    else      printf("缺乏右括号\n"); 	 	return 0; }  [/quote]看不出来哪里错啦！[/quote]

user: user-0
content: 引用 1 楼 turingo 的回复:可否先把语法错误都改好？  [quote=引用 楼主 u013133423 的回复:] 请帮我改代码，不要只说大概，为什么打开内容为“{[()[()]]”的“xxx.txt”文件，程序显示“括号不匹配！”，应该为“缺乏右括号啊”#define INITSTACKSIZE 50 #define INCREMENT 10 #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct { 	char *top; 	char *base; 	int stacksize; }Stack; void Push(Stack &s,char c) { 	if((s.top-s.base)>=s.stacksize) 		s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 	if(!s.base) 		exit(0); 	s.top=s.base+s.stacksize; 	s.stacksize+=INCREMENT; 	*s.top++=c; } void Pop(Stack &s,char &c) { 	if(s.top==s.base) 		exit(0); 	c=*--s.top; } int StackEmpty(Stack s) { 	if(s.top==s.base) 		return 1; 	else 		return 0; } void InitStack(Stack &a) { 	a.base=(char*)malloc(INITSTACKSIZE*sizeof(char)); 	if(!a.base) 	{ 		printf("分配空间失败!\n"); 		exit(-1); 	} 	a.top=a.base; 	a.stacksize=INITSTACKSIZE; } int main() {    	FILE *fp; 	Stack s; 	char a[100],b[100],e; 	char *p; 	printf("请输入您要读取的文件名:\n"); 	gets(a); 	fp=fopen(a,"r"); 	if(fp==NULL) 	{ 		printf("打开文件失败!\n"); 		exit(0); 	} 	else 	{ 		printf("文件打开成功!\n"); 	} 		fscanf(fp,"%s",b); 	fclose(fp); puts(b); 	InitStack(s); 	p=b;  while(*p) // 没到串尾      switch(*p)      {        case '(':        case '[':        case '{':Push(s,*p++); // 左括号入栈，且p++                 break;        case ')':        case ']':        case '}':if(!StackEmpty(s)) // 栈不空                 {                   Pop(s,e); // 弹出栈顶元素                   if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))                   { // 出现3种匹配情况之外的情况                     printf("左右括号不配对\n");                     exit(0);                   }                 }                 else // 栈空                 {                   printf("缺乏左括号\n");                   exit(0);                 }        default: p++; // 其它字符不处理，指针向后移      }    if(StackEmpty(s)) // 字符串结束时栈空      printf("括号匹配\n");    else      printf("缺乏右括号\n"); 	 	return 0; }  [/quote]看不出来哪里错啦！

user: user-3
content: 可否先把语法错误都改好？  引用 楼主 u013133423 的回复:请帮我改代码，不要只说大概，为什么打开内容为“{[()[()]]”的“xxx.txt”文件，程序显示“括号不匹配！”，应该为“缺乏右括号啊”#define INITSTACKSIZE 50 #define INCREMENT 10 #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct { 	char *top; 	char *base; 	int stacksize; }Stack; void Push(Stack &s,char c) { 	if((s.top-s.base)>=s.stacksize) 		s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 	if(!s.base) 		exit(0); 	s.top=s.base+s.stacksize; 	s.stacksize+=INCREMENT; 	*s.top++=c; } void Pop(Stack &s,char &c) { 	if(s.top==s.base) 		exit(0); 	c=*--s.top; } int StackEmpty(Stack s) { 	if(s.top==s.base) 		return 1; 	else 		return 0; } void InitStack(Stack &a) { 	a.base=(char*)malloc(INITSTACKSIZE*sizeof(char)); 	if(!a.base) 	{ 		printf("分配空间失败!\n"); 		exit(-1); 	} 	a.top=a.base; 	a.stacksize=INITSTACKSIZE; } int main() {    	FILE *fp; 	Stack s; 	char a[100],b[100],e; 	char *p; 	printf("请输入您要读取的文件名:\n"); 	gets(a); 	fp=fopen(a,"r"); 	if(fp==NULL) 	{ 		printf("打开文件失败!\n"); 		exit(0); 	} 	else 	{ 		printf("文件打开成功!\n"); 	} 		fscanf(fp,"%s",b); 	fclose(fp); puts(b); 	InitStack(s); 	p=b;  while(*p) // 没到串尾      switch(*p)      {        case '(':        case '[':        case '{':Push(s,*p++); // 左括号入栈，且p++                 break;        case ')':        case ']':        case '}':if(!StackEmpty(s)) // 栈不空                 {                   Pop(s,e); // 弹出栈顶元素                   if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))                   { // 出现3种匹配情况之外的情况                     printf("左右括号不配对\n");                     exit(0);                   }                 }                 else // 栈空                 {                   printf("缺乏左括号\n");                   exit(0);                 }        default: p++; // 其它字符不处理，指针向后移      }    if(StackEmpty(s)) // 字符串结束时栈空      printf("括号匹配\n");    else      printf("缺乏右括号\n"); 	 	return 0; }