解题思路:
本题是栈的应用问题,主要是对进栈、出栈进行模拟。输入一个进栈序列记为 in 和出栈序列 out 。设置两个变量 i 、 j 和一个堆栈S,栈中存放的是题目输入的入栈序列,初始时 i 指向out字符串首字符,j 指向in字符串首字符,接着对 i 和 j 进行遍历。遍历过程中有如下几种情况:
1、i 和 j 所指的字符相同,说明此时轮到对该节车厢进行操作,即先将其入栈然后出栈。
2、i 和 j 所指的字符不相同,又分两种情况。如果栈非空且栈顶元素和现在出栈序列 j 所指字符相同,那就将栈顶元素出栈。如若不是执行进栈操作。
最后如果栈中仍有元素不能出战的,那就说明从入栈序列到出栈序列是行不通的。
举个栗子:
input:
4 1234 3241
过程应该是:1、2、3依次进栈,然后3、2依次出栈,4进栈然后出栈,最后1进栈然后出栈。最后栈中没有任何元素。
以下给出代码:
#include <bits/stdc++.h>
using namespace std;
stack<char> s;
int n;
char op[100]; //保存进栈、出栈操作序列
bool f;
void init(){
f=true;
while(!s.empty())
s.pop();
memset(op,'\0',sizeof(op));
}
int main(){
while(~scanf("%d",&n)){
string in,out;
cin>>in>>out; //输入两个序列
int num=0,i,j;
init(); //初始化操作
for(i=0;i<out.length();){
for(j=0;j<in.length();){
if(out[i]!=in[j]){ //i、j所指字符不相同
if(!s.empty()&&out[i]==s.top()){ //栈非空且栈顶元素和此时出栈序列所指元素相同
s.pop();
op[num++]='o';
i++;
}else{
s.push(in[j]);
op[num++]='i';
j++;
}
}else{ ///i、j所指字符相同
op[num++]='i';
op[num++]='o';
i++;
j++;
}
}
if(j==in.length())
break;
}
while(!s.empty()){
if(s.top()==out[i]){
op[num++]='o';
s.pop();
i++;
}else{
f=false;
break;
}
}
if(f){
printf("Yes.\n");
for(j=0;j<num;j++){
if(op[j]=='i')
printf("in\n");
else if(op[j]=='o')
printf("out\n");
}
}else
printf("No.\n");
printf("FINISH\n");
}
return 0;
}