由N(1 <= N <= 26)个互异字母组成的字符序列依次入栈,判断给出的序列是否可能是出栈序列。
Input
第一行输入正整数T,表示测试案例的组数
下面依次输入T组测试数据,每组包含两行,第一行表示入栈序列,第二行表示待判定的序列。
Output
YES 表示可能是出栈序列
NO 表示不可能是出栈序列
此题比较简单,利用栈的进出规则模拟一下就可。
先一个一个扫描待判定的序列,扫描一个字符就在入栈序列中找到该字符,该字符前面的字符都压入辅助栈中。如果最后辅助栈的栈顶指针为-1则是出栈序列。
此题的代码如下:
#include<stdio.h> #include<string.h> int main() { char s1[27],s2[27],s3[27];//s3为辅助栈 int n,top,i,k,j; scanf("%d",&n); while(n--) { top=-1; scanf("%s%s",s1,s2); k=strlen(s1); j=0; for(i=0;i<k;i++)//扫描s2 { if(s2[i]==s3[top]&&top>-1) top--; else for(;j<k;j++) if(s2[i]!=s1[j])//在入栈序列中找到s2[i],并且把前面的那些字符放到辅助栈中 s3[++top]=s1[j]; else { j++;break; } } if(top==-1) printf("YES "); else printf("NO "); } return 0; }