题目:
分析:
这道题目火车进出站的顺序是先进后出,和栈一样,所以可以用元素进出栈来模拟火车进出站。首先要注意的是这题的输入的进出序号是两串字符串in和out,所以应该把栈的类型定为char,由于如果可以调整,还要输出出入站顺序,所以还需要一个数组output来记录。现在我们就来看看怎么确定是否能够调整。in和out分别表示的是进站顺序和出站顺序,如果能同时满足这两个顺序,就说明是可调整的。每辆火车都恰好进出一次,也就意味着如果能调整,那么最后车站应该是没有车的。对应于栈来说就是栈为空。那么这道题就相当于这样一个模型:通过in和out两个序列来控制in序列各元素进出栈,判断经过若干次操作后,栈是否为空。操作就两种,一种进栈,一种出栈。i从in序列最左边开始,j从out最左边开始,进栈条件是栈为空或者out[j]不等于栈顶元素,output记录‘in’,i++;出栈条件为栈顶元素和out[j]相等,output记录'out',j++。接下来就是确定什么时候结束这些操作。要进栈的元素只在in中,当i已经走过in的最右边时(i>=n),有三种情况,一是栈恰好为空,说明所有元素都已经进出一次了,这时可以结束并且判定结果是可以调整;二是栈不为空且栈顶元素不等于out[j],那么本来这时候是要进栈一个元素,可是in已经到头了,没有可以进栈的元素,这时候就结束操作,由于栈不为空,所以不能调整;还有一种情况是栈不为空,但是栈顶元素却等于out[j],这时候出栈操作还能进行,可以继续,直到遇到前两种情况为止。这样就能判断是否能够调整了。最后只要根据判断结果决定是否输出output记录的各个值就好了。
代码:
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main()
{
int n, i=0, j=0, k=0;
string in,out,output[18];
stack<char>s;
cin >> n;
cin>>in;
cin>>out;
while (1)
{
if (s.empty())
{
if (i < n)
{
s.push(in[i]);
i++;
output[k]="in";
k++;
}
else
break;
}
else if (!s.empty())
{
if (s.top() == out[j])
{
s.pop();
j++;
output[k]="out";
k++;
}
else if (s.top() != out[j] && i < n)
{
s.push(in[i]);
i++;
output[k]="in";
k++;
}
else if (i = n&&s.top() != out[j])
break;
}
}
if (!s.empty())
cout << "No" << endl;
else
{
cout<<"Yes"<<endl;
for(i=0;i<k;i++)
cout<<output[i]<<endl;
}
return 0;
}