题目描述
假设表达式中允许包含两种括号:圆括号和方括号。编写一个算法判断表达式中的括号是否正确配对。
输入
由括号构成的字符串,包含”(“、”)“、”[“和”]“。
输出
如果匹配输出YES,否则输出NO。
样例输出
YES
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define MaxSize 1000
typedef struct linknode
{
char data;
struct linknode *next;
}LinkStNode;
void init(LinkStNode*&st)
{
st=(LinkStNode*)malloc(sizeof(LinkStNode));
st->next=NULL;
}
void push(LinkStNode*&st,char letter)
{
LinkStNode *p;
p=(LinkStNode*)malloc(sizeof(LinkStNode));
p->data=letter;
p->next=st->next;
st->next=p;
}
bool Empty(LinkStNode*st)
{
return (st->next==NULL);
}
char pop(LinkStNode*&st)
{
if(Empty(st)) return 'G';
//如果栈是空的,则无法出栈
//此句不可省略,否则会运行超时
char digit;
LinkStNode*p;
p=st->next;//指向首结点
digit=p->data;//提取首结点数据
st->next=p->next;//跳过首结点
free(p);//删除首结点
return digit;//返回首结点数据
}
bool Convert(linknode*&st,char str[])
{
int len=strlen(str);
for(int i=0;i<len;i++)//遍历字符数组str
{
//如果是"("或"["都进栈
if(str[i]=='('||str[i]=='[')
{
push(st,str[i]);
}else
if(str[i]==')'||str[i]==']')
{
char TopLetter;
TopLetter=pop(st);//取栈顶元素
if(TopLetter=='G')特殊情况,栈空
{
return false;
}
switch(str[i])//如果找到不匹配的,则提前结束
{
//当前是左括号
//则栈顶必须是右括号
case ')':
if(TopLetter!='(')
return false;
break;
case ']':
if(TopLetter!='[')
return false;
break;
}
}
}
return true;
}
int main()
{
char str[MaxSize];
LinkStNode*st;
init(st);
scanf("%s",str);
bool flag=Convert(st,str);//匹配
if(flag) printf("YES");
else printf("NO");
}