#include#define STACK_INIT_SIZE 100//栈的长度 #define STACKINCREMENT 10//每次增加的长度 #define OK 1 #define OVERFLOW -2 #define ERROR 0 typedef char SElemType; typedef int Status; //---------------------------------------结构体定义区-------------------------------- typedef struct { SElemType *base;//栈底指针,栈构造前和销毁后都为空 SElemType *top;//栈顶指针,指向栈顶元素的下一位置 int stacksize;//当前分配的栈的存储空间数 }SqStack; //----------------------------------------函数定义区--------------------------------- Status GetTop(SqStack S,SElemType &e) { if(S.top==S.base) return ERROR; e=*(S.top-1); return OK; } Status InitStack(SqStack &S)//初始化函数 { S.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) exit(OVERFLOW);//代码健壮性检验 S.top= S.base;//赋初值——栈顶=栈尾 S.stacksize = STACK_INIT_SIZE;//栈长初始化 return OK; } Status StackEmpty(SqStack S)//栈空函数 { return S.top == S.base;//栈空时候头为尾 } Status Push(SqStack &S, SElemType e)//压栈函数 { if(S.top - S.base>=S.stacksize) return ERROR; *S.top++ = e;//向top指针指向的空间赋值,赋完后指针top后移一位 return OK; } Status Pop(SqStack &S, SElemType &e)//弹出函数 { if(S.base == S.top) return ERROR; e = *--S.top; return OK; } Status Match(char *st)//匹配括号函数 { SqStack S; InitStack(S); SElemType e; int flag = 1,i = 0; while(st[i]) { switch(st[i])//字符串有值 { case '(': case '[': case '{': Push(S,st[i]);//只要是左括号就全压入栈 break; case ')': case '}': case ']': if(StackEmpty(S))//如果栈是空的话(右括号先进来的情况),flag=0 { flag = 0; break; } Pop(S,e); if(!(e == '('&&st[i] == ')'||e == '['&&st[i] == ']'||e == '{'&&st[i] == '}')) {//左右不匹配的情况 flag = 0; break; } } if(!flag) break; i++; } if(flag && StackEmpty(S))//标志为True且所有括号匹配完 return true; else return false; } //--------------------------------------主函数区--------------------------------------- int main(){ char st[1000]; while(gets(st)) { if(Match(st)) printf("yesn"); else printf("non"); } return 0; }



