当前位置: 代码迷 >> 综合 >> HDU 1022(栈)
  详细解决方案

HDU 1022(栈)

热度:11   发布时间:2023-11-22 22:13:54.0

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;
}