user-0 提问: 括号匹配问题

回复:
user: user-0
content: 引用 8 楼 paschen 的回复:[quote=引用 7 楼 xinye1230 的回复:] [quote=引用 6 楼 paschen 的回复:] [quote=引用 5 楼 xinye1230 的回复:] [quote=引用 3 楼 paschen 的回复:] 另外,scanf 接收 %c时，会将之前输入完留在缓冲区中的 \n接收了，所以建议改用getchar #include<stdio.h> #include<malloc.h> #include<string.h> #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10  #define OK 1 #define ERROR 0 typedef char ElemType; typedef struct { /*建立一个栈的首结点*/     ElemType * base;     ElemType * top;     int stacksize; } SqStack; int InitStack(SqStack *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(SqStack *s) { /*判断栈是否为空*/     if (s->top==s->base) return OK;     else                 return ERROR; } int Push(SqStack *s,ElemType ch) { /*往栈顶插入元素即进栈*/     if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/         s->base=((ElemType*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType)));         if (!s->base) return ERROR;         s->stacksize+=STACKINCREMENT;         s->top=s->base+s->stacksize;     }     *s->top++=ch;     return OK; } int Pop(SqStack *s,ElemType *ch) { /*让栈顶元素依次输出即出栈*/     if (StackEmpty(s)) return ERROR;     *ch=*(--s->top);     return OK; }  int main() { 	char ch; 	SqStack s; 	InitStack(&s); 	scanf("%c",&ch); 	while(ch!='#') 	{ 		if(ch=='('||ch=='['||ch=='{') 			Push(&s,ch); 		if(ch==')'||ch==']'||ch=='}') 		{ 			if(StackEmpty(&s)) 			{ 			 				printf("右多\n"); 				return 0; 			} 			Pop(&s,&ch); 			if((ch=='('&&ch!=')')||(ch=='['&&ch!=']')||(ch=='{'&&ch!='}')) 			{ 				 				printf("左右不匹配\n"); 				return 0; 			} 		} 		ch=getchar(); 	} 	if(!StackEmpty(&s)) 	{ 	 		printf("左多\n"); 		return 0; 	} 	else 	{ 	 		printf("正确\n"); 		return 1; 	} 	return 0;  } 这个代码我修改了  可是为什么执行的结果不正确呢？[/quote]  给出你输入的内容和希望的结果  你前面的scanf("%c",&ch); 也改成用getchar[/quote]  我把前面的scanf改成ch=getchar（）；但是结果还是不对  是不是 我的算法有错？本来括号就是匹配的，它总出现括号不匹配！[/quote]  Pop(&s,&ch); 这里的ch换一个变量，不然他把原来的c覆盖，你再比较没什么意思了[/quote] 我改成其他变量了  结果正确了  谢谢你。

user: user-0
content: 谢谢  赵四老师、

user: user-1
content: 引用 5 楼 xinye1230 的回复:[quote=引用 3 楼 paschen 的回复:] 另外,scanf 接收 %c时，会将之前输入完留在缓冲区中的 \n接收了，所以建议改用getchar #include<stdio.h> #include<malloc.h> #include<string.h> #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10  #define OK 1 #define ERROR 0 typedef char ElemType; typedef struct { /*建立一个栈的首结点*/     ElemType * base;     ElemType * top;     int stacksize; } SqStack; int InitStack(SqStack *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(SqStack *s) { /*判断栈是否为空*/     if (s->top==s->base) return OK;     else                 return ERROR; } int Push(SqStack *s,ElemType ch) { /*往栈顶插入元素即进栈*/     if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/         s->base=((ElemType*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType)));         if (!s->base) return ERROR;         s->stacksize+=STACKINCREMENT;         s->top=s->base+s->stacksize;     }     *s->top++=ch;     return OK; } int Pop(SqStack *s,ElemType *ch) { /*让栈顶元素依次输出即出栈*/     if (StackEmpty(s)) return ERROR;     *ch=*(--s->top);     return OK; }  int main() { 	char ch; 	SqStack s; 	InitStack(&s); 	scanf("%c",&ch); 	while(ch!='#') 	{ 		if(ch=='('||ch=='['||ch=='{') 			Push(&s,ch); 		if(ch==')'||ch==']'||ch=='}') 		{ 			if(StackEmpty(&s)) 			{ 			 				printf("右多\n"); 				return 0; 			} 			Pop(&s,&ch); 			if((ch=='('&&ch!=')')||(ch=='['&&ch!=']')||(ch=='{'&&ch!='}')) 			{ 				 				printf("左右不匹配\n"); 				return 0; 			} 		} 		ch=getchar(); 	} 	if(!StackEmpty(&s)) 	{ 	 		printf("左多\n"); 		return 0; 	} 	else 	{ 	 		printf("正确\n"); 		return 1; 	} 	return 0;  } 这个代码我修改了  可是为什么执行的结果不正确呢？[/quote]  给出你输入的内容和希望的结果  你前面的scanf("%c",&ch); 也改成用getchar

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-1
content: 引用 7 楼 xinye1230 的回复:[quote=引用 6 楼 paschen 的回复:] [quote=引用 5 楼 xinye1230 的回复:] [quote=引用 3 楼 paschen 的回复:] 另外,scanf 接收 %c时，会将之前输入完留在缓冲区中的 \n接收了，所以建议改用getchar #include<stdio.h> #include<malloc.h> #include<string.h> #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10  #define OK 1 #define ERROR 0 typedef char ElemType; typedef struct { /*建立一个栈的首结点*/     ElemType * base;     ElemType * top;     int stacksize; } SqStack; int InitStack(SqStack *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(SqStack *s) { /*判断栈是否为空*/     if (s->top==s->base) return OK;     else                 return ERROR; } int Push(SqStack *s,ElemType ch) { /*往栈顶插入元素即进栈*/     if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/         s->base=((ElemType*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType)));         if (!s->base) return ERROR;         s->stacksize+=STACKINCREMENT;         s->top=s->base+s->stacksize;     }     *s->top++=ch;     return OK; } int Pop(SqStack *s,ElemType *ch) { /*让栈顶元素依次输出即出栈*/     if (StackEmpty(s)) return ERROR;     *ch=*(--s->top);     return OK; }  int main() { 	char ch; 	SqStack s; 	InitStack(&s); 	scanf("%c",&ch); 	while(ch!='#') 	{ 		if(ch=='('||ch=='['||ch=='{') 			Push(&s,ch); 		if(ch==')'||ch==']'||ch=='}') 		{ 			if(StackEmpty(&s)) 			{ 			 				printf("右多\n"); 				return 0; 			} 			Pop(&s,&ch); 			if((ch=='('&&ch!=')')||(ch=='['&&ch!=']')||(ch=='{'&&ch!='}')) 			{ 				 				printf("左右不匹配\n"); 				return 0; 			} 		} 		ch=getchar(); 	} 	if(!StackEmpty(&s)) 	{ 	 		printf("左多\n"); 		return 0; 	} 	else 	{ 	 		printf("正确\n"); 		return 1; 	} 	return 0;  } 这个代码我修改了  可是为什么执行的结果不正确呢？[/quote]  给出你输入的内容和希望的结果  你前面的scanf("%c",&ch); 也改成用getchar[/quote]  我把前面的scanf改成ch=getchar（）；但是结果还是不对  是不是 我的算法有错？本来括号就是匹配的，它总出现括号不匹配！[/quote]  Pop(&s,&ch); 这里的ch换一个变量，不然他把原来的c覆盖，你再比较没什么意思了

user: user-0
content: 引用 6 楼 paschen 的回复:[quote=引用 5 楼 xinye1230 的回复:] [quote=引用 3 楼 paschen 的回复:] 另外,scanf 接收 %c时，会将之前输入完留在缓冲区中的 \n接收了，所以建议改用getchar #include<stdio.h> #include<malloc.h> #include<string.h> #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10  #define OK 1 #define ERROR 0 typedef char ElemType; typedef struct { /*建立一个栈的首结点*/     ElemType * base;     ElemType * top;     int stacksize; } SqStack; int InitStack(SqStack *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(SqStack *s) { /*判断栈是否为空*/     if (s->top==s->base) return OK;     else                 return ERROR; } int Push(SqStack *s,ElemType ch) { /*往栈顶插入元素即进栈*/     if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/         s->base=((ElemType*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType)));         if (!s->base) return ERROR;         s->stacksize+=STACKINCREMENT;         s->top=s->base+s->stacksize;     }     *s->top++=ch;     return OK; } int Pop(SqStack *s,ElemType *ch) { /*让栈顶元素依次输出即出栈*/     if (StackEmpty(s)) return ERROR;     *ch=*(--s->top);     return OK; }  int main() { 	char ch; 	SqStack s; 	InitStack(&s); 	scanf("%c",&ch); 	while(ch!='#') 	{ 		if(ch=='('||ch=='['||ch=='{') 			Push(&s,ch); 		if(ch==')'||ch==']'||ch=='}') 		{ 			if(StackEmpty(&s)) 			{ 			 				printf("右多\n"); 				return 0; 			} 			Pop(&s,&ch); 			if((ch=='('&&ch!=')')||(ch=='['&&ch!=']')||(ch=='{'&&ch!='}')) 			{ 				 				printf("左右不匹配\n"); 				return 0; 			} 		} 		ch=getchar(); 	} 	if(!StackEmpty(&s)) 	{ 	 		printf("左多\n"); 		return 0; 	} 	else 	{ 	 		printf("正确\n"); 		return 1; 	} 	return 0;  } 这个代码我修改了  可是为什么执行的结果不正确呢？[/quote]  给出你输入的内容和希望的结果  你前面的scanf("%c",&ch); 也改成用getchar[/quote]  我把前面的scanf改成ch=getchar（）；但是结果还是不对  是不是 我的算法有错？本来括号就是匹配的，它总出现括号不匹配！

user: user-0
content: 引用 3 楼 paschen 的回复:另外,scanf 接收 %c时，会将之前输入完留在缓冲区中的 \n接收了，所以建议改用getchar #include<stdio.h> #include<malloc.h> #include<string.h> #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10  #define OK 1 #define ERROR 0 typedef char ElemType; typedef struct { /*建立一个栈的首结点*/     ElemType * base;     ElemType * top;     int stacksize; } SqStack; int InitStack(SqStack *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(SqStack *s) { /*判断栈是否为空*/     if (s->top==s->base) return OK;     else                 return ERROR; } int Push(SqStack *s,ElemType ch) { /*往栈顶插入元素即进栈*/     if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/         s->base=((ElemType*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType)));         if (!s->base) return ERROR;         s->stacksize+=STACKINCREMENT;         s->top=s->base+s->stacksize;     }     *s->top++=ch;     return OK; } int Pop(SqStack *s,ElemType *ch) { /*让栈顶元素依次输出即出栈*/     if (StackEmpty(s)) return ERROR;     *ch=*(--s->top);     return OK; }  int main() { 	char ch; 	SqStack s; 	InitStack(&s); 	scanf("%c",&ch); 	while(ch!='#') 	{ 		if(ch=='('||ch=='['||ch=='{') 			Push(&s,ch); 		if(ch==')'||ch==']'||ch=='}') 		{ 			if(StackEmpty(&s)) 			{ 			 				printf("右多\n"); 				return 0; 			} 			Pop(&s,&ch); 			if((ch=='('&&ch!=')')||(ch=='['&&ch!=']')||(ch=='{'&&ch!='}')) 			{ 				 				printf("左右不匹配\n"); 				return 0; 			} 		} 		ch=getchar(); 	} 	if(!StackEmpty(&s)) 	{ 	 		printf("左多\n"); 		return 0; 	} 	else 	{ 	 		printf("正确\n"); 		return 1; 	} 	return 0;  } 这个代码我修改了  可是为什么执行的结果不正确呢？

user: user-0
content: 引用 1 楼 user-3 的回复:严重性	代码	说明	项目	文件	行	禁止显示状态 警告	C4477	“scanf”: 格式字符串“%c”需要类型“char *”的参数，但可变参数 1 拥有了类型“int”	Project1	c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c	61 什么意思？

user: user-1
content: 另外,scanf 接收 %c时，会将之前输入完留在缓冲区中的 \n接收了，所以建议改用getchar

user: user-1
content: scanf("%c",ch);  改成   scanf("%c",&ch);

user: user-3
content: 严重性	代码	说明	项目	文件	行	禁止显示状态 警告	C4477	“scanf”: 格式字符串“%c”需要类型“char *”的参数，但可变参数 1 拥有了类型“int”	Project1	c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c	61