/*
*括号匹配问题描述:对于嵌套的括号形式,用栈检测是否是合法的形式。例如【()】()()就是合法的,(【()()】)也是合法的,((【)】())等是不合法的。
*/
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <assert.h> //栈的初始最大容量 #define STACK_MAX_SIZE 100 //栈的容量增量 #define INCREAMENT 10 //状态函数 #define ERROR 0 #define OK 1 #define SOVERFLOW -1 #define YES 1 #define NO 0 typedef int Status; typedef char SElemType,ElemType; typedef struct{ SElemType *base; SElemType *top; int stackSize;//当前已经分配的空间,不是指栈中元素个数。 }sqStack; Status InitStack(sqStack &S){ //初始化栈空间,栈为空 S.base = (SElemType *)malloc(STACK_MAX_SIZE * sizeof(ElemType)); if(!S.base){ exit(SOVERFLOW); } S.top = S.base; S.stackSize = STACK_MAX_SIZE; return OK; } //如果栈不空,用e传出栈顶元素并返回OK。否则返回错误。 Status GetTop(sqStack S,SElemType &e){ if(S.top == S.base){ return ERROR; } e = *(S.top - 1); return OK; } /* * Push(S,e)向栈S中压入元素e。需要考虑的情况有: * 1.栈已经满,需要增加空间。如果无法继续增加空间,则退出。 * 2.栈未满。先压入元素,然后修改栈顶指针。 **/ Status Push(sqStack &S,SElemType e){ if((S.top - S.base) >= S.stackSize){ S.base = (ElemType*)realloc(S.base,(S.stackSize + INCREAMENT) * sizeof(ElemType)); if(!S.base){ exit(SOVERFLOW); } S.top = S.base + S.stackSize; S.stackSize += INCREAMENT; } //先压入元素,然后修改指针。弹出时相反 *S.top = e; S.top ++; return OK; } /* * 弹出栈顶元素。需要注意的有: * 1.栈不空。则先修改指针,然后弹出元素并传送给e。 * 2.栈为空时,返回错误。 */ Status Pop(sqStack &S,ElemType &e){ if(S.top == S.base){ return ERROR; } //先修改指针,然后弹出元素。 S.top --; e = *S.top; return OK; } Status isEmpty(sqStack S){ if(S.top == S.base){ return YES; } return NO; } //检测括号是否匹配,假设只有()[]两类括号 int checkBracket(char *s){ char * p = s; sqStack S; InitStack(S); char cur,res; while(*p != '\0'){ if(*p == '[' || *p == '('){ Push(S,*p); } else if(*p == ']'){ GetTop(S,cur); if(cur != '['){ return 0; }else{ if(!isEmpty(S)){ Pop(S,cur); }else{ return 0; } } }else if(*p == ')'){ GetTop(S,cur); if(cur != '('){ return 0; }else{ if(!isEmpty(S)){ Pop(S,cur); }else{ return 0; } } } p++; } if(!isEmpty(S)){ return 0; } return 1; } main(){ char *s = "()()()()[]"; char *t = "([(]()[]"; printf("%d \n",checkBracket(s)); printf("%d \n",checkBracket(t)); system("pause"); return 0; }