Hdu 1022(栈)
问题描述:
随着新学期的到来,如今的伊格纳修斯火车站非常繁忙。许多学生想乘火车回到学校(因为伊格纳修斯火车站的火车是全世界最快的火车)。但是,这里出现了一个问题,所有火车停靠的只有一条铁路。所以所有的火车都是从一侧进来的,而从另一侧出来的。对于此问题,如果火车A先进入铁路,然后火车B在火车A离开之前就进入铁路,那么火车A直到火车B离开后才能离开。下图说明了问题所在。现在的问题是,车站中最多有9列火车,所有火车都有一个ID(从1到n编号),火车以O1的顺序进入铁路,您的任务是确定火车是否可以按照O2的顺序下车。
input:
输入包含几个测试用例。每个测试用例都由一个整数,火车的数量和两个字符串组成,火车的顺序为:O1,火车的顺序为:O2。输入在文件末尾终止。样本输入中有更多详细信息。
output:
输出包含字符串“ No”。如果您无法将O2交换为O1,或者您应该输出一条包含“是”的行,然后输出交换订单的方式(您应该输入“入站”以表示进入铁路的火车,然后“出站”一列火车驶出铁路)。在每个测试用例之后打印一行包含“ FINISH”的行。样本输出中有更多详细信息。
样例 :
输入:
3 123 321
3 123 312
输出:
Yes.
in
in
in
out
out
out
FINISH
No.
FINISH
题解:
题目的意思就是按照第一个输入的顺序将n个数压栈(因为最多有9个火车 所以栈类型用char即可)然后判断是否可以按照第二次输入的顺序离开 不能则输出NO.FINISH
如果可以的话就按顺序输出in out。
题目给的样例很容易让人理解为逆序就YES,其实不然。
下面给出一个简单例子:进栈(设为栈a)从底部到顶部:(1)->(2)->(3)->(4) 出栈(设为栈b) 从顶部到底部 :(2)->(4)->(3)->(1)
a.push((1)) a栈的栈顶元素: (1),此时查看b的栈顶元素为(2) 二者不相等所以 b栈不用动 对于a栈来说只是输入第一个元素 ;//输出in
a.push((2)) a栈的栈顶元素 : (2),此时b栈顶的元素仍然为(2),二者相等所以清除b栈栈顶元素 b.pop(); 那么a栈栈顶元素也可以out啦 //输出 in out
此时b栈有的元素是 (4)->(3)->(1)
a.push((3)) a栈的栈顶元素: (3),此时b栈顶元素为(4),不相等所以老样子 不用动 只是a栈进入了元素(3)//in
a.push( (4) ) : a栈的栈顶元素: (4),此时b栈栈顶元素为 (4),两者相等清除b栈栈顶元素 b.pop();//in out
此时a栈(从顶部到底部)还剩(3)->(1) b栈还剩(从顶部到底部)(3)->(1)
a b栈顺序从顶部到底部相同 输出剩余数量的out就结束啦!
废话不再多说 直接上代码理解吧。
#include <iostream>
#include <stack>
using namespace std;
int main()
{stack<char> s;char a[106],b[105];int i,j,n,l,f[100];while(cin>>n>>a>>b){l=0;i=0;j=0;s.push(a[i]);f[l++]=1;while(i<n&&j<n){if(s.size()&&s.top()==b[j]){s.pop();j++;f[l++]=0;}else{s.push(a[++i]);f[l++]=1;}}if(i==n)//结束条件,模拟{cout<<"No."<<endl;cout<<"FINISH"<<endl;}else{cout<<"Yes."<<endl;for(i=0;i<l;i++)if(f[i]!=0)cout<<"in"<<endl;else cout<<"out"<<endl;cout<<"FINISH"<<endl;}}return 0;
}