user-0 提问: 括号匹配

回复:
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-2
content: 就是用栈。当读取到一个括号的左半边后，将它入栈。当读取到一个括号的右半边时，将栈顶的元素逐个出栈，直到对应的这种括号的左半边。 全部符号读取完毕后，栈应当是空的。

user: user-3
content: 是，我看数据结构里有说，要用堆栈

user: user-4
content: #include<stdio.h> #include<string.h>  #define max 200 struct no{ 	int x,y; };  struct stack{ 	char *top; 	char *base; 	int size; }; no jun(char e) { 	no m;     if(e=='(')     {     	m.x=0;     	m.y=1;     	return m;     }     else if(e==')')     {     	m.x=1;     	m.y=1;     	return m;     }     else if(e=='[')     {     	m.x=0;     	m.y=2;     	return m;     }     else if(e==']')     {     	m.x=1;     	m.y=2;     	return m;     }     else if(e=='{')     {     	m.x=0;     	m.y=3;     	return m;     }     else     {     	m.x=1;     	m.y=3;     	return m;     } } void set(stack &s) { 	s.base=new char[max]; 	s.top=s.base; 	s.size=max;  } void push(stack &s,char e) { 	*(s.top)=e; 	s.top++; } char top(stack &s) { 	return *(s.top-1); } void pop(stack &s) { 	s.top--; } bool empty(stack &s) { 	if(s.top==s.base) 	return true; 	return false; } int main() { 	stack S; 	char a[1000]; 	int n,g=0; 	set(S); 	printf("请输入要检验的内容：");  	scanf("%s",a); 	n=strlen(a); 	for(int i=0;i<n;i++) 	{          if(jun(a[i]).x==0)          {          	push(S,a[i]);          }          else          {          	if(empty(S))          	{          		g=1;          		break;          	}          	else          	{          	    if(jun(top(S)).y==jun(a[i]).y)          	    {          		    pop(S);          	    }          	    else          	    {          		    g=1;          		    break;          	    }             }          } 	} 	printf("检验结果为："); 	if(g==0) 	printf("匹配\n"); 	else 	printf("此串括号匹配不合法\n"); 	return 0; }

user: user-5
content: 可以使用栈的思想写，简洁清晰