判断一个括号序列中左右括号是否匹配
解题思路:
扫描到左括号则入栈,扫描到右括号则与栈顶的左括号比较,如果匹配则栈顶括号出栈,不匹配则整个序列不匹配。
如果最后栈里还有未匹配的左括号则也是匹配失败。
代码如下:
#include<stdio.h>
#include<string.h>
#define Maxsize 100
typedef struct
{
char data[Maxsize];
int top;
} SqStack;
void InitStack(SqStack &S)
{
S.top=-1;
}
bool StackEmpty(SqStack S)
{
if(S.top==-1) return true;
else return false;
}
bool Push(SqStack &S,char x)
{
if(S.top==Maxsize-1) return false;
S.data[++S.top]=x;
return true;
}
bool Pop(SqStack &S,char &x)
{
if(S.top==-1) return false;
x=S.data[S.top--];
return true;
}
int main()
{
SqStack S;
InitStack(S);
StackEmpty(S);
char str[100];
scanf("%s",str);
// int len;
// len=strlen(str);
// printf("len===%d\n",len);
char x;
int flag=0;
for(int i=0;i<strlen(str);i++)
{
if( str[i]=='(' || str[i]=='[' || str[i]=='{')//如果是左括号就把它入栈
{
Push(S,str[i]);
}
else//如果是右括号
{
if(StackEmpty(S))//当前栈是空的
{
flag=1;
printf("***匹配失败!\n");
break;
}
// printf("当前栈顶元素是:%c\n",S.data[S.top]);
// printf("str[i]==%c\n",str[i]);
if(str[i]==')' && S.data[S.top]=='(')//当前栈顶元素是左小括号并且当前读入的是右小括号
{
Pop(S,x);
//printf("当前出栈的栈顶元素是:%c\n",x);
}
else if(str[i]==']' && S.data[S.top]=='[')//当前栈顶元素是左中括号并且当前读入的是右中括号
{
Pop(S,x);
//printf("当前出栈的栈顶元素是:%c\n",x);
}
else if(str[i]=='}' && S.data[S.top]=='{')//当前栈顶元素是左大括号并且当前读入的是右大括号
{
Pop(S,x);
//printf("当前出栈的栈顶元素是:%c\n",x);
}
else
{
printf("匹配失败!\n");
break;
}
}
}
if(StackEmpty(S) && flag==0)//当前栈是空的
{
printf("匹配成功!\n");
}
return 0;
}
/*
[([][])]{}
[([][]{)]{}
[([][])]{}}
*/