user-0 提问: 括号匹配，无法实现

回复:
user: user-0
content: 谢谢各位大神

user: user-0
content: 我只懂c语言，

user: user-1
content: 楼主，把分给了三楼结贴吧，没必要看太多，人家的就很好了

user: user-2
content: 楼主，首先，你的数组边界弄错了，int c[10];那么数组的最多到c[9],没有c[10],你的循环里就到了c[10].其次：这个问题用栈的数据结构来做是最好的，因为《数据结构》教材上就有这个例子。   希望能够纠正你的方向。

user: user-3
content: 其实grammar的可以简单一点   template<typename Iterator> struct recursiveBraces : qi::grammar<Iterator, qi::ascii::space_type> {     recursiveBraces() : recursiveBraces::base_type(finalRules)     {         braces = "(" >> *expression >> ")";         expression = +braces;         finalRules = +expression;     }      qi::rule<Iterator, qi::ascii::space_type> braces;     qi::rule<Iterator, qi::ascii::space_type> expression;     qi::rule<Iterator, qi::ascii::space_type> finalRules; };   Iterator == iterator的type qi::ascii::space_type == 忽略 " "  braces = "(" >> *expression >> ")"; 以EBNF来表达就是 "\(expression*\)"  expression = +braces; 以EBNF来表达就是 braces+  所以上述rules的意思是 braces = 第一个必须是 "(",中间可以有0～多个expression,最后必须是")" expression = 一个或多个braces  而braces会呼叫expression,expression会呼叫braces 所以这就形成了recursive

user: user-4
content: 引用 10 楼 ForestDB 的回复:#include<stdio.h> int main() { int i,j,m; char a[10],b[10],c[10]; for(i=0;i<11;i++) scanf("%c",c[i]); // c只能存10个char，但是i却是从0到10（有效的是到9为止） // 运行完for之后，i的值为11， if(c[i]='(') // 这里i的值为11，直接拿来用了？ a[j]=c[i]; // j的初值是多少？ if(c[i]=')') b[m]=c[i]; // m又是多少？ else printf("输入出错\n"); printf("%d\n",j); printf("%d\n",m);  if(j=m) printf("(等于)\n"); printf("%d\n",j); printf("%d\n",m);  return 0; }   打好基础。  恩 是的。

user: user-5
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-6
content: #include<stdio.h> int main() { int i,j,m; char a[10],b[10],c[10]; for(i=0;i<11;i++) scanf("%c",c[i]); // c只能存10个char，但是i却是从0到10（有效的是到9为止） // 运行完for之后，i的值为11， if(c[i]='(') // 这里i的值为11，直接拿来用了？ a[j]=c[i]; // j的初值是多少？ if(c[i]=')') b[m]=c[i]; // m又是多少？ else printf("输入出错\n"); printf("%d\n",j); printf("%d\n",m);  if(j=m) printf("(等于)\n"); printf("%d\n",j); printf("%d\n",m);  return 0; }   打好基础。

user: user-3
content: #include <iostream> #include <string>  #include <boost/spirit/include/qi.hpp>  namespace qi = boost::spirit::qi;  template<typename Iterator> struct recursiveBraces : qi::grammar<Iterator, std::string(), qi::ascii::space_type> {     recursiveBraces() : recursiveBraces::base_type(expression)     {         braces = qi::lit("(") >> *expression >> ")";         expression = +braces;         finalRules = +expression;     }      qi::rule<Iterator, std::string(), qi::ascii::space_type> braces;     qi::rule<Iterator, std::string(), qi::ascii::space_type> expression;     qi::rule<Iterator, std::string(), qi::ascii::space_type> finalRules; };  void parse_recursive_braces() {     std::string const braces[] =     {         {"( () )"}, {"("}, {"(() ())"}, {"(  ( ( ( () ) ) ) )"},         {"(((( ( ))))"}, {"(() ()) ((())) (())"}, {"(() ()) ((( ( ))) (())"}     };     recursiveBraces<std::string::const_iterator> grammar;      for(auto const &data : braces){          auto begin = std::begin(data), end = std::end(data);         bool r = qi::phrase_parse(begin, end, grammar, qi::ascii::space);          if(r && begin == end){             std::cout<<"match"<<std::endl;         }else{             std::cout<<"wrong"<<std::endl;         }     } }  int main() {     parse_recursive_braces(); }   稍微扩充一下就可以做更复杂的匹配

user: user-3
content: #include <iostream> #include <string>  #include <boost/spirit/include/qi.hpp>  namespace qi = boost::spirit::qi;  template<typename Iterator> struct recursiveBraces : qi::grammar<Iterator, std::string(), qi::ascii::space_type> {     recursiveBraces() : recursiveBraces::base_type(expression)     {         braces = qi::lit("(") >> *expression >> ")";         expression = +braces;     }      qi::rule<Iterator, std::string(), qi::ascii::space_type> braces;     qi::rule<Iterator, std::string(), qi::ascii::space_type> expression; };  inline void parse_recursive_braces() {     std::string const braces[] =     {         {"( () )"}, {"("}, {"(() ())"}, {"(  ( ( ( () ) ) ) )"}     };     recursiveBraces<std::string::const_iterator> grammar;      for(auto const &data : braces){          auto begin = std::begin(data), end = std::end(data);         bool r = qi::phrase_parse(begin, end, grammar, qi::ascii::space);          if(r && begin == end){             std::cout<<"match"<<std::endl;         }else{             std::cout<<"wrong"<<std::endl;         }     } }  int main() {    parse_recursive_braces(); }  重点其实就是recursive,问问你自己该如何把EBNF的语法转换成程式？

user: user-7
content: 引用 4 楼 u010286751 的回复:[quote=引用 2 楼 xb1198023575 的回复:] 这代码....呵呵.... 确实有点乱，我改了一下看看合不合你的意思 代码：#include<stdio.h> int main() {  int i,j=0,m=0,k;  char a[10],b[10],c[10];   for(i=0;i<10;i++)     scanf("%c",&c[i]);  for(k=0;k<10;k++){    if(c[k]=='(')     {            a[j]=c[k];            ++j;      }    if(c[k]==')')    {     b[m]=c[k];     ++m;    }     if(c[k]!='(' && c[k]!=')')         printf("error\n"); }   printf("%d\n",j);   printf("%d\n",m);     if(j==m)      printf("(等于)\n");   printf("%d\n",j);   printf("%d\n",m);    return 0; }[/quote]  你不用另外弄两个数组保存'(',')',没用，弄个整形保存计数就得了，用保存输入那个数组也没啥用，直接用getchar读单个字母就行啊，还不用限制输入的个数，然后判断是不是括号，是左括号还是右括号....，另外三楼那个不是挺好的答案吗，

user: user-8
content: 引用 2 楼 xb1198023575 的回复:这代码....呵呵.... 确实有点乱，我改了一下看看合不合你的意思 代码：#include<stdio.h> int main() {  int i,j=0,m=0,k;  char a[10],b[10],c[10];   for(i=0;i<10;i++)     scanf("%c",&c[i]);  for(k=0;k<10;k++){    if(c[k]=='(')     {            a[j]=c[k];            ++j;      }    if(c[k]==')')    {     b[m]=c[k];     ++m;    }     if(c[k]!='(' && c[k]!=')')         printf("error\n"); }   printf("%d\n",j);   printf("%d\n",m);     if(j==m)      printf("(等于)\n");   printf("%d\n",j);   printf("%d\n",m);    return 0; }

user: user-9
content: 可以用到栈来处理，给个C++的实现： #include <iostream> #define MAXSIZE 50 using namespace std; typedef char ElemType;  struct SqStack { 	ElemType Data[MAXSIZE]; 	int top; };  //初始化栈 void InitStack(SqStack* &stack) { 	stack = new SqStack; 	stack->top = -1; }  //销毁栈 void DestroyStack(SqStack* &stack) { 	delete stack; }  //判断栈是否为空 bool Empty(SqStack* stack) { 	return stack->top == -1; }  //入栈 bool Push(SqStack* &stack, ElemType e) { 	if (stack->top == MAXSIZE - 1) 		return false;  	stack->top++; 	stack->Data[stack->top] = e; 	return true; }  //出栈 bool Pop(SqStack* &stack, ElemType &e) { 	if (stack->top == -1) 		return false;  	e = stack->Data[stack->top]; 	stack->top--; 	return true; }  //取栈顶元素 bool GetTop(SqStack* stack, ElemType &e) { 	if (stack->top == -1) 		return false;  	e = stack->Data[stack->top]; 	return true; }   //判断表达式中的小括号（）是对匹配 bool Match(char * Expresion) { 	SqStack* Stack = NULL;	//初始化栈 	InitStack(Stack);  	int Length = strlen(Expresion);  	int i = 0; 	while (Expresion[i] != '\0') 	{ 		ElemType Elem; 		if (Expresion[i] == '(')		//如果是左括号，则将其入栈 		{ 			Push(Stack, '('); 		} 		else if (Expresion[i] == ')')	//如果是右括号，则从栈中弹出一个左括号 		{ 			if (Stack->top == -1) 				return false; 			Pop(Stack, Elem); 		} 		i++; 	}  	if (Empty(Stack))		//栈空则匹配 		return true; 	else 		return false; }  int main() { 	char Expresion[] = "()(()()())"; 	if (Match(Expresion)) 	{ 		cout << "匹配！" << endl; 	} 	else 	{ 		cout << "不匹配！" << endl; 	}  	system("pause"); 	return 0; }   重点看下 Match()这个函数。

user: user-7
content: 这代码....呵呵....

user: user-10
content: 首先不知道code想实现什么意图 第二j和m都没有初始化，跑飞是大概率事件