输入一串括号字符串(仅包含"(",")","[","]","{","}"),输出是否匹配成功。
括号匹配问题属于栈的应用问题。通过输入一串括号字符串,如“((({[]})))”,可以看出,后输入的元素先行匹配,即后进先出,我们可以使用栈来解决此问题。
代码如下:
#include<stdio.h>
#include<string.h>
#define MaxSize 20
typedef struct{ //定义顺序栈
char data[MaxSize];
int top;
}Sqstack;
//初始化顺序栈
void InitStack(Sqstack &S){
S.top=-1;
}
//元素入栈
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;
}
bool Check(char a[],int length){ //符号匹配函数
Sqstack S;
InitStack(S);
int i;
char topElem; //用来存栈顶元素
for(i=0;i<length;i++){ //逐个扫描输入字符a[i]
if(a[i]=='('||a[i]=='['||a[i]=='{'){ //a[i]为左括号
Push(S,a[i]); //当前符号a[i]入栈
printf("第%d个符号%c入栈\n",i+1,a[i]);
}
else{ //当前符号为右括号
if(S.top==-1){ //判断栈是否空
printf("右括号单身:第%d个符号%c不可匹配\n",i+1,a[i]);
return false; //栈空,则当前a[i]无匹配的左括号,匹配失败
}
Pop(S,topElem); //栈不为空,栈顶元素出栈
printf("栈顶元素%c出栈\n",topElem);
if(a[i]==')'&&topElem!='('){ //栈顶元素与当前符号不匹配,匹配失败
printf("左右括号不匹配:栈顶元素%c和第%d个符号%c不匹配\n",topElem,i+1,a[i]);
return false;
}
if(a[i]==']'&&topElem!='['){
printf("左右括号不匹配:栈顶元素%c和第%d个符号%c不匹配\n",topElem,i+1,a[i]);
return false;
}
if(a[i]=='}'&&topElem!='{'){
printf("左右括号不匹配:栈顶元素%c和第%d个符号%c不匹配\n",topElem,i+1,a[i]);
return false;
}
printf("第%d个符号%c与栈顶元素%c匹配\n",i+1,a[i],topElem);
//栈顶元素与当前符号匹配,将继续扫描下个符号
}
}
//待匹配符号扫描完毕,判断栈是否为空
if(S.top==-1) return true; //栈空,匹配成功
else{ //栈非空,有左括号未匹配,匹配失败
printf("左括号单身:栈顶元素%c未匹配\n",S.data[S.top]);
return false;
}
}
int main(){
int i;
char a[MaxSize];
scanf("%s",a);
int length=strlen(a);
printf("输入符号个数为:%d\n",length);
if(Check(a,length)) printf("匹配成功!\n");
else printf("匹配失败!\n");
return 0;
}
运行结果: