/*
*括号匹配问题描述:对于嵌套的括号形式,用栈检测是否是合法的形式。例如【()】()()就是合法的,(【()()】)也是合法的,((【)】())等是不合法的。
*/
#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;
}