是一道很露骨的模拟栈的题目,但是由于第一次做到,还是卡了一下的。
就是用一个stack来模拟,让进栈的序列逐个进栈,然后再每次都判断一下是否与当前出栈序列的位置符合,如果不符合就继续进栈,如果符合就出栈,弄清楚各个的标记即可。
因为如果当前的栈顶符合出栈序列的当前位置却不出栈的话,它一定会在接下来入栈的车的后面出栈,就不可能符合给定的出栈顺序。
然而题目的数据好弱,后来才发现我都忘了用题目中“车站里最多只能同时有9辆车”这个条件,但是还是AC了,其实加个约束也是很简单的,不会影响总体思路。
代码如下:(没有加站里9辆车的限制)
#include <stack>
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
int n;
char before[100],after[100];
bool change[100];
while(cin>>n>>before>>after){
int i=0,j=0,k=0;
stack<char>st;
while(1){
if(st.size()&&st.top()==after[j]){
st.pop();
change[k++]=0;
j++;
}
else{
if(i==n)
break;
st.push(before[i++]);
change[k++]=1;
}
}
if(!st.size()){
printf("Yes.\n");
for(int x=0;x<k;x++)
if(change[x])
printf("in\n");
else
printf("out\n");
printf("FINISH\n");
}
else{
printf("No.\n");
printf("FINISH\n");
}
}
return 0;
}