括号匹配
描述
假设一个算术表达式中可以包含三种括号:圆括号"("和")",方括号"["和"]"和花括号"{"和"}",且这三种括号可按任意的次序嵌套使用,如:...[...(...)...{...{...}...[...]...}...]...,编写程序判别给定表达式中所含括号是否正确配对出现。
输入
输入一个由这几种括号组成的字符串,字符串长度不大于100。
输出
若正确则输出"Yes",否则输出"No"。注意字母的大小写,结尾带回车。
输入样例
{()[]}{}
输出样例
Yes
#include <stdio.h>
#include <stdlib.h>
#define MAXNUM 100
#define SizeAdd 10
//typedef char CharType;
typedef char ElemType;
typedef struct
{
int *base;
int *top;
int stackSize;
}sqStack;
void InitStack(sqStack *s)
{
s->base=(int *)malloc(MAXNUM * sizeof(ElemType));
s->top=s->base;
s->stackSize=MAXNUM;
}
void PushStack(sqStack *s,ElemType e)
{
if(s->top-s->base>=s->stackSize)
{
s->stackSize+=SizeAdd;
s->base=(int *)realloc(s->base,s->stackSize*sizeof(ElemType));
s->top=s->base+s->stackSize;
}
*(s->top)=e;
s->top++;
}
void PopStack(sqStack *s,ElemType *e)
{
if(s->top==s->base)
return;
*e=*--(s->top);
}
int StackLen(sqStack *s)
{
return (s->top-s->base);
}
int Match(char e,char c)
{
if(e=='('&&c==')')
return 1;
if(e=='['&&c==']')
return 1;
if(e=='{'&&c=='}')
return 1;
return 0;
}
int main()
{
sqStack s;
char c,e;
InitStack(&s);
scanf("%c",&c);
while(c!='\n')
{
if(!StackLen(&s))
PushStack(&s,c);
else
{
PopStack(&s,&e);
if(!Match(e,c))
{
PushStack(&s,e);
PushStack(&s,c);
}
}
scanf("%c",&c);
}
//PopStack(&s,&e);
//printf("test1\n");
if(!StackLen(&s))
{
printf("Yes\n");
//printf("test1\n");
}
else
printf("No\n");
return 0;
}