/*判断一串序列能否按照堆栈的方式,进出栈之后得到另外一组序列*/
/*要把题目当做已知进出序列进行对比*/
#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct node { char st[4]; }str[10000]; int main() { int n,i,j,t,k,ok; char stack[10000]; char come[10000],leave[10000]; while(scanf("%d",&n)!=EOF) { i=j=t=k=0; ok=1; scanf("%s%s",come,leave); while(j<n) {//思考方式为用两个数组保存两个序列 出---->进栈 if(come[i]==leave[j]){i++;j++;strcpy(str[k++].st,"in");strcpy(str[k++].st,"out");}
//如果序列相同,说明时进栈后直接出栈 else if(stack[t]==leave[j]&&t){j++;t--;strcpy(str[k++].st,"out");}
//如果栈首元素和出的序列相同,那么是从栈出的 else if(i<n){stack[++t]=come[i];i++;strcpy(str[k++].st,"in");}
//如果进栈的元素没有到尾,说明还有要进栈的 else {ok=0;break;}
//否则,没有满足的序列 } if(ok) { t=0; printf("Yes.\n"); while(t<k) { printf("%s\n",str[t++].st); } printf("FINISH\n"); } else printf("No.\nFINISH\n"); } return 0; }