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

回复:
user: user-0
content: 是该函数无法处理（）这种字符吗？

user: user-0
content: 小弟现在还不会栈函数

user: user-0
content: // acm 括号配对.cpp : 定义控制台应用程序的入口点。 //输入样本个数和括号样本，看括号是否可以配成对   #include "StdAfx.h" #include<stdio.h> #include<string.h> #include<ctype.h> #include <stdlib.h> int main(void)   //"[]"==91.93   "()""==40.41 { 	int n,a; 	int w=0; 	int t,j,u; 	char name[1000]; 	char*p; 	printf("请输入样本个数："); 	scanf("%d",&n); 	for(int i=0;i<n;i++) 	{ 		printf("请输入测试样本："); 		scanf("%s",name);            //在此处有一个奇怪的错误，再按shift加9，0表示输入括号时，此处占用的字符数为4，但是若不按shift，则正常 		p=name; 		if(strlen(name)%2!=0) 			break; 			                                //我想利用ASCII表进行判断，我感觉“("与")"在表的值上应该差的数字是有规律的 			                        //利用这个规律应该可以在if语句中进行判断 		//  situation 1 		if(toascii(*(p+w))==91&&toascii(*(p+strlen(name)-1-w))==93) 		{ 				for(t=1;t<strlen(name);t++) 				{ 					if(toascii(*(p+strlen(name)-1-t))-toascii(*(p+t))==2||1) 						continue; 					else 						break; 				} 		switch(t>1) 		{ 		case 1: 			printf("YES"); 		case 0: 			printf("NO"); 		} 		} 		 	// situation 2			 		if(toascii(*(p+w))==93&&toascii(*(p+strlen(name)-1-w))==91) 		{ 			for(j=1;j<strlen(name);j++) 			{ 				if(toascii(*(p+strlen(name)-1-j))-toascii(*(p+j))==2||1) 					continue; 				else 					break; 			} 		switch(j>1) 		{ 		case 1: 			printf("YES"); 		case 0: 			printf("NO"); 		} 		} //situation 3 		if(toascii(*(p+w))==40&&toascii(*(p+strlen(name)-1-w))==41) 		{ 			for(u=1;u<strlen(name);u++) 			{ 				if(toascii(*(p+strlen(name)-1-u))-toascii(*(p+u))==2||1) 					continue; 				else 					break; 			} 		switch(u>1) 		{ 		case 1: 			printf("YES"); 		case 0: 			printf("NO"); 		} 		}  	//situation 4 	    if(toascii(*(p+w))==41&&toascii(*(p+strlen(name)-1-w))==40) 		{ 			for(a=1;a<strlen(name);a++) 			{ 				if(toascii(*(p+strlen(name)-1-a))-toascii(*(p+a))==2||1) 					continue; 				else 					break; 			} 		switch(a>1) 		{ 		case 1: 			printf("YES"); 		case 0: 			printf("NO"); 		} 		} 	} 	printf("NO"); 	return 0; } 		 为什么toascii函数不起作用呢？各位

user: user-1
content: 审题比英文更重要！

user: user-2
content: 英文很重要

user: user-1
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: 如果不需要能预编译头文件，删除#include "stdafx.h"这句   加上 #include <stdio.h>   #include <tchar.h>  前者里包含了printf scanf函数 后者包含了TCHAR宏定义

user: user-0
content: fefe82 说的对，是我没审好题

user: user-0
content: 小弟发现了错误，if的判断思路不对 改正代码如下：  // acm 括号配对.cpp : 定义控制台应用程序的入口点。 //输入样本个数和括号样本，看括号是否可以配成对   #include "StdAfx.h" #include<stdio.h> #include<string.h> int main(void) { 	int n,a; 	int w=0; 	char name[1000]; 	char*p; 	printf("请输入样本个数："); 	scanf("%d",&n); 	for(int i=0;i<n;i++) 	{ 		printf("请输入测试样本："); 		scanf("%s",name);            //在此处有一个奇怪的错误，再按shift加9，0表示输入括号时，此处占用的字符数为4，但是若不按shift，则正常 		p=name; 		if(strlen(name)%2!=0) 			printf("NO\n"); 		switch (*(p+w)) 		{ 		case '[': 			  { 				  if(*(p+strlen(name)-w-1)==']') 					  printf("YES"); 				  else 					  printf("NO"); 			break; 			  } 		case ']': 			  { 				  if(*(p+strlen(name)-w-1)=='[') 					  printf("YES"); 				  else 					  printf("NO"); 			break; 			  } 		case '(': 			  { 				  if(*(p+strlen(name)-w-1)==')') 					  printf("YES"); 				  else 					  printf("NO"); 			break; 			  } 		case ')': 			  { 				  if(*(p+strlen(name)-w-1)=='(') 					  printf("YES"); 				  else 					  printf("NO"); 			break; 			  } 		default: 			{ 				printf("NO"); 				break; 			} 		} 	} 	return 0; } 		  但是acm还是说：runningtime error  	运行时出错： 常见出错的原因可能有以下几种： 1、数组开得太小了，导致访问到了不该访问的内存区域 2、发生除零错误 3、大数组定义在函数内,导致程序栈区耗尽 4、指针用错了，导致访问到不该访问的内存区域 5、还有可能是程序抛出了未接收的异常

user: user-4
content: 数据保证S中只含有"[","]","(",")"四种字符  {} 哪来的？

user: user-5
content: 引用 3 楼 ylxd41 的回复:这个搞定了，但是又出现了running error，实在不行了，各位帮帮忙。 在本地执行时，有个特例，就是输入{}是无法得出正确结果 谢谢大家你的printf（）NO和 YES 而题目中是No和Yes 题目中的符号是[](),你并不需要输入其他字符，你可以去搜搜别的博客，这是nyoj的题目，很多的

user: user-0
content: 这个搞定了，但是又出现了running error，实在不行了，各位帮帮忙。 在本地执行时，有个特例，就是输入{}是无法得出正确结果 谢谢大家

user: user-4
content: //#include "stdafx.h" #include <string.h> #include <stdio.h> int main(int argc, char * argv[])