假设以S和X分别表示入栈和出栈操作。如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入S和X序列,判断该序列是否合法。
输入格式:
输入第一行给出两个正整数 n 和 m,其中 n 是待测序列的个数,m(≤50)是堆栈的最大容量。随后 n 行,每行中给出一个仅由S和X构成的序列。序列保证不为空,且长度不超过100。
输出格式:
对每个序列,在一行中输出YES如果该序列是合法的堆栈操作序列,或NO如果不是。
输入样例:
4 10
SSSXXSXXSX
SSSXXSXXS
SSSSSSSSSSXSSXXXXXXXXXXX
SSSXXSXXX
输出样例:
YES
NO
NO
NO
分析:
存好字符串后,从头开始对字符串逐个判断,S为入栈,X为出栈,同时用len来记录栈的元素个数,当len>m时,栈已经在插入元素时满了(属于不合法操作),令flag=1;当len<0时,栈已经在删除元素时空了(也属于不合法操作),令flag=1。最后,如果len==0并且操作过程中没有不合法操作,即flag=0时,同时满足则为合法操作,输出YES,否则输出NO。
代码
#include <stdio.h>
int main()
{
int n, max;
int len;
int flag;
char a[110];
scanf("%d %d",&n,&max);
getchar();
for(int i=0;i<n;i++)
{
len=0;
flag=0;//flag=0表示操作合法
scanf("%s",a);
for(int j=0;a[j]!='\0';j++)
{
if(a[j]=='S')//入栈操作
{
len++;
if(len>max)//栈满
flag=1;
}
else if(a[j]=='X')//出栈操作
{
len--;
if(len<0)
flag=1;
}
}
if(len==0&&flag==0)//合法条件
printf("YES\n");
else
printf("NO\n");
}
return 0;
}