题目描述
假设表达式中允许包含两种括号:圆括号和方括号。编写一个算法判断表达式中的括号是否正确配对。
输入
由括号构成的字符串,包含”(“、”)“、”[“和”]“。
输出
如果匹配输出YES,否则输出NO。
样例输入
[([][]())]
样例输出
YES
思路
判断是否匹配,关键是,要怎么判断,在本题中,我们应该要这样做:
左括号应该进符号栈,而遇到右括号就马上进行判断是否和符号栈的顶元素是否匹配。
代码实现
#include<iostream>
#include"string.h"
#include"stdlib.h"
using namespace std;
typedef struct//存储符号的结构体
{
char a[100];
int top;
}SqStack;
void initl(SqStack *&s)// 初始化 符号栈
{
s=(SqStack *) malloc(sizeof(SqStack));
s->top=-1; //-1的好处是 入栈先自增后面判栈元素很好判断,一个技巧
}
void Push(SqStack *&s,char c)//入栈
{
s->a[++s->top]=c;
}
void Judg(SqStack *&s,char c)//判断
{
if(s->a[s->top]=='('&&c==')')
{
s->top--;
}
else if(s->a[s->top]=='['&&c==']')
{
s->top--;
}
else//不匹配结束程序
{
cout<<"NO";
exit(-1);
}
}
int main()
{
SqStack *stack;
initl(stack);
char stu[100];
cin>>stu;
for(int i=0;i<strlen(stu);i++)
{
if(stu[i]=='['||stu[i]=='(')
Push(stack,stu[i]);//入栈
else if(stu[i]==']'||stu[i]==')')
Judg(stack,stu[i]);//判断
}
//当我们执行完上述操作后,匹配的栈顶元素s->top应该为-1,如果不是则不匹配
if(stack->top!=-1)
{
cout<<"NO";
}
else
{
cout<<"YES";
}
return 0;
}