栈的相关特点相信大家都知道,那么我们如何利用它来检验括号是否匹配呢。
主要思路如下:
1.扫描整个表达式;
2.判断当前字符是否为括号(左右括号)
①如果不是,则继续扫描下一个字符;
②如果是,则判断当前字符是否为左括号,若为左括号—>直接入栈,若为右括号,看栈顶的左括号是否与之匹配,如果匹配,则把该左括号出栈,并继续扫描下一个字符,如果不匹配,则直接标记并退出循环,无需再扫描了。3.最后
a.带了标记—–>说明不匹配。
b.没带标记但栈不为空—–>说明左括号多于右括号。
c.没带标记且栈为空—–>说明括号匹配成功。
接下来,我们利用这个来做两道题:
例1:
#include<stdio.h>
#include<string.h>
char a[150],b[150];
int main()
{
int n=0;
scanf("%d",&n);
getchar();
for(int i=0; i<n; i++)
{
int flag=0,top=0;
gets(a);//输入为空时也能处理
int l=strlen(a);
if(l==0)
{
printf("Yes\n");
continue;
}
for(int j=0; j<l; j++)
{
if(a[j]=='('||a[j]=='[')
{
top++;
b[top]=a[j];
}
else
{
if((b[top]=='('&&a[j]==')')||(b[top]=='['&&a[j]==']'))
{
top--;//匹配消去一个左括号
}
else
{
flag=1;//不匹配
break;
}
}
}
if(flag==1)
{
printf("No\n");
continue;
}
if(top==0&&flag==0)printf("Yes\n");
if(top!=0)printf("No\n");
}
return 0;
}
第二个题相比于第一个题有些不一样,可以仔细体会他们的区别
#include<stdio.h>
#include<string.h>
char a[10000][10000],b[10000];
int main()
{
while(gets(a[0])!=NULL)
{
int i=0;
while(1)
{
i++;
gets(a[i]);
if(strcmp(a[i],"Ctrl+Z")==0)
break;
}
int flag=0,top=0;
for(int k=0; k<i; k++)
{
int l=strlen(a[k]);
for(int j=0; j<l; j++)
{
if(a[k][j]=='('||a[k][j]=='{')
{
top++;
b[top]=a[k][j];
}
else
{
if((b[top]=='('&&a[k][j]==')')||(b[top]=='{'&&a[k][j]=='}'))
{
top--;
}//匹配正确
else
{
flag=1;//不匹配
break;
}
}
}
}
if(flag==1)
{
printf("Wrong\n");
continue;
}
if(top==0&&flag==0)printf("Right\n");
if(top!=0)printf("Wrong\n");
}
return 0;
}
相信在练过这两个题后大家能进一步的加深对栈“先进后出”的特性的利用,如果有问题,希望能在评论区留言交流。