user-0 提问: 关于ACM在线测试 第二题. 括号配对问题 望老司机带路....谢谢.

回复:
user: user-1
content: 就用数组就能完成任务

user: user-1
content: 就是进栈出栈的问题, 应该不长的代码就可以完成任务.

user: user-2
content: 引用 8 楼 QQ541159192 的回复:[quote=引用 7 楼 redRnt 的回复:] 可以参考一下我的博客哦http://blog.csdn.net/redrnt/article/details/65485202 您好, 可以请您指出来我代码的问题吗/?? 我运行后, 结果是对的. 但是提交上去就不通过.这点我很郁闷.[/quote] 可以，你这个只是适合一般的情况，你的思路有问题，你是第一个跟最后一个成立，然后继续深入匹配，你代码没错但是思路不对，导致的是不能应用于一般的情况，只能用于特殊情况我同意12楼的建议。 你试试 {[][]} 这种类型吧，按道理是yes，我运行你的代码却不是。我博客的第一条测试就是这个。这个问题的解决最好用栈

user: user-3
content: 题意应该是，无论哪个括号都要一一对应，并不是首尾括号相同，左右中小括号数量相同就正确

user: user-3
content: 这个是否吧，用你写的代码应该是yes

user: user-0
content: 引用 4 楼 kugeniha 的回复:刚好满足题目，试试这个 (([)]) 是的这个可以满足, 但是提交上去后不通过.

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:仅供参考：#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: 引用 7 楼 redRnt 的回复:可以参考一下我的博客哦http://blog.csdn.net/redrnt/article/details/65485202 您好, 可以请您指出来我代码的问题吗/?? 我运行后, 结果是对的. 但是提交上去就不通过.这点我很郁闷.

user: user-4
content: 关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

user: user-4
content: 边界条件 输入输出格式 ……

user: user-2
content: 可以参考一下我的博客哦http://blog.csdn.net/redrnt/article/details/65485202

user: user-0
content: 引用 楼主 QQ541159192 的回复:比较纳闷. 不知道ACM的判断规则是什么???是通过逻辑匹配还是结果匹配. 求各位大神指点一下.   原题:  描述 现在，有一行括号序列，请你检查这行括号是否配对。 输入 第一行输入一个数N（0<N<=100）,表示有N组测试数据。后面的N行输入多组输入数据，每组输入数据都是一个字符串S(S的长度小于10000，且S不是空串），测试数据组数少于5组。数据保证S中只含有"","(",")"四种字符 输出 每组输入数据的输出占一行，如果该字符串中所含的括号是配对的，则输出Yes,如果不配对则输出No  样例输入  3 [(]) (]) ([[]()])  样例输出  No No Yes   ------------------------------------------------------------------------------------------------------------------------------------ 我写的代码.   #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<malloc.h> #include<string.h>  struct InputString { 	char inputStr[100]; }; bool getInputChar2(char * inputS) { 	int size = strlen(inputS); 	int mSize = (int)size / 2;//[91 ]93 (40 )41 	//([[]()])  匹配例子. 	if (size % 2 != 0) 	{ 		return false; 	} 	size = size - 1; 	if ((inputS[0] == '[' && inputS[size] == ']' 		|| inputS[0] == '(' && inputS[size] == ')'))//只当第一个与最后一个匹配再深入匹配. 	{ 		int count = 1; 		for (int i = 1; i < size; i++) 		{ 			//一个一个的取出来，对比。 			char s = inputS[i]; 			for (int j = i + 1; j < size; j++) 			{ 				if (s == inputS[j] - 1 || s == inputS[j] - 2) 				{ 					count++; 					break; 				} 			} 		} 		return count == mSize; 	} 	else 	{ 		return false; 	} } int main(void) { 	int Inputsize;  	scanf("%d", &Inputsize); 	if (Inputsize < 0 || Inputsize >= 100) 	{ 		return 0; 	} 	struct InputString * inputStr = (struct InputString *)malloc(Inputsize*sizeof(struct InputString)); 	for (int i = 0; i < Inputsize; i++) 	{ 		scanf("%s", inputStr[i].inputStr); 	} 	for (int i = 0; i < Inputsize; i++) 	{ 		bool isTrue = getInputChar2(inputStr[i].inputStr); 		printf("%s\n", isTrue == 1 ? "YES" : "NO"); 	} }  按照题目要求的返回值修改后还是不通过.

user: user-5
content: 结果匹配。正常情况下需要严格匹配。比如题目要求输出Yes你输出YES那估计就答案错误了。

user: user-4
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-3
content: 刚好满足题目，试试这个 (([)])