您的位置:首页 > 其它

括号分配(栈和队列)C

2016-04-08 20:34 260 查看


问题 C: 括号匹配(栈和队列)

时间限制: 1 Sec 内存限制: 128 MB

提交: 70 解决: 17

[提交][状态][讨论版]

题目描述

假设一个表达式中只允许包含三种括号:圆括号“(”和“)”,方括号“[”和“]”和花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用如:(…[…{…
…[…]…}…[…]…(…)…]…)。设计一个算法,判断表达式中的括号是否正确配对。输出结果为Yes或者No。

顺序栈的定义为

typedef struct
{
char date[Max];
int top;
} Spstack;

需编写的算法为int solve(char *a,Spstack *st);

可使用的函数有:
1、bool Pop(Spstack *&s,char &e); //出栈
2、bool GetTop(Spstack *s,char &e); //取栈顶元素
3、bool Push(Spstack *&s,char e); //入栈
4、bool StackEmpty(Spstack *s); //判断是否为空栈

括号匹配正确返回1,否则返回0。其中a为该表达式,st为一个空栈。

输入

{[][]()([])}[]()

输出

Yes

样例输入

{[()[]][}]

样例输出

No

提示

1、注意括号匹配问题

2、只需提交你所编写的算法

#include <stdio.h>
#define Max 105
typedef struct
{
char date[Max];
int top;
} Spstack;
void InitStack(Spstack *&s)
{
s= new Spstack;
s->top=-1;
}
bool StackEmpty(Spstack *s)
{
return(s->top==-1);
}
bool Push(Spstack *&s,char e)
{
if(s->top==Max-1)return false;
s->top++;
s->date[s->top]=e;
return true;
}
bool GetTop(Spstack *s,char &e)
{
if(s->top==-1)return false;
e=s->date[s->top];
return true;
}
bool Pop(Spstack *&s,char &e)
{
if(s->top==-1)return false;
e=s->date[s->top];
s->top--;
return true;
}
void DestroyStack(Spstack * &s)
{
delete(s);
}int solve(char *a,Spstack *st)
{
int i=0;
char e;
int match=1;
while(a[i]!='\0'&&match)
{
if(a[i]=='('||a[i]=='['||a[i]=='{')
Push(st,a[i]);
else if(a[i]==')'||a[i]==']'||a[i]=='}')
{
if(a[i]==')'&&GetTop(st,e)==true)
{

if(e!='(')
match=false;
else
Pop(st,e);

}
else if(a[i]==']'&&GetTop(st,e)==true)
{

if(e!='[')
match=false;
else
Pop(st,e);

}
else if(a[i]=='}'&&GetTop(st,e)==true)
{

if(e!='{')
match=false;
else
Pop(st,e);

}
else match=0;

}

i++;
}
if(!StackEmpty(st))
match=0;
return match;
}
int main()
{
char a[100];
bool match;
Spstack *st;
InitStack(st);
gets(a);
match=solve(a,st);
DestroyStack(st);
if(match)printf("Yes\n");
else printf("No\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: