题目描述
假设表达式中允许包含两种括号:圆括号和方括号。编写一个算法判断表达式中的括号是否正确配对。
输入
由括号构成的字符串,包含( ){ }[ ]。
输出
如果匹配输出YES,否则输出NO。
样例输入
复制
[([][]())]
样例输出
YES
解决思想:拿到字符串后,遍历字符串,当遇到左括号就进栈,右括号栈顶元素出栈,如果括号是匹配的,则最终栈空。
#include<stdio.h>
#include<string.h>
typedef struct Stack{
char data[20];
int top;
}Stack;
int isEmpty(Stack &st) //判断栈是否为空
{
if(st.top==-1)
{
return 1;
}
return 0;
}
void fetchQuote(char a[],int len) //括号匹配函数
{
Stack stack;
stack.top=-1;
//如果第一个元素是右括号,则肯定不匹配。
if(a[0]==')'||a[0]==']'||a[0]=='}')
{
printf("NO");
return;
}
for(int i=0;i<len;i++)
{
if(a[i]=='('||a[i]=='['||a[i]=='{') //左括号就进栈
{
stack.data[++stack.top]=a[i];
}
else
{
//遇到右括号就出栈,并判断栈顶元素是否与当前元素相匹配。
if((a[i]==')'&&stack.data[stack.top]=='(')||(a[i]==']'&&stack.data[stack.top]=='[')||(a[i]=='}'&&stack.data[stack.top]=='{'))
{
stack.top--;
}
else
{
printf("NO");
}
}
}
if(isEmpty(stack))
{
printf("YES");
}
else
{
printf("NO");
}
}
int main()
{
char quo1[6]={'(',')','[','(',')',']'};
char quo2[6]={'(',')','[','(',']',')'};
char quo[100];
while(scanf("%s",quo)!=EOF)
{
int len=strlen(quo);
fetchQuote(quo,len);
}
//fetchQuote(quo1,6);
// fetchQuote(quo2,6);
}