对题意有不理解的建议直接看英文原版,描述更细致
中文题意
某城市有一个火车站,铁轨铺设如图。有n节车厢从A方向驶入车站,按进站的顺序编号为1~n。你的任务是判断是否能让他们按照某种特定的顺序进入B方向的铁轨并驶出车站。例如,出栈顺序(5 4 1 2 3)是不可能的,但(5 4 3 2 1)是可能的。 为了重组车厢,你可以借助中转站C。这是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出C。对于每节车厢,一旦从A移入C,就不能返回A了;一旦从C移入B,就不能返回C了。也就是说,在任意时刻,只有两种选择:A到C和C到B。
对于每一组数据,第一行是一个整数 N 。接下来若干行数据,每行 N 个数,代表 11 ~ N 车厢的出栈顺序,最后一组数据只有一个整数 0。对于每一组数据,在最后输出空行。
最后一组数据的 N=0 ,不输出。
n<=1000
输入输出样例
输入
5 1 2 3 4 5 5 4 1 2 3 0 6 6 5 4 3 2 1 0 0
输出
Yes No Yes
题意分析:
本题是对栈Stack先进后出的特点考察的经典例题
对于一个从小到大的序列,如果当数k已经出栈了,那么比数k小的一定入栈了,并且在栈里的顺序也是满足从栈顶到栈底是从大到小的顺序的
那么我们可以模拟整个出栈顺序:遍历题目给的出栈顺序,假如遍历到了k,表示k已经出栈了,把不比k大的数字(比k小和k自己)且还未入栈的数字全部按照顺序入栈(用a表示哪些数字入栈了),然后判断此时栈顶的元素是不是k,如果不是说明顺序是错的
因为如果是栈顶元素,就能顺序是满足入栈出栈规则的,是可以实现的,如果不是就说明有问题;
所以本题的思路:就是已知一个数字集合的初始序列,然后问能否通过栈来改变顺序,能符合题目给出的测试序列,如果能就输入Yes,如果不能就输出No,所以题目的核心代码就是实现一个Stack的判断规则,这个规则有很多条,任选一条实现就可以
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
//题目会给出多组测试数据,不知道具体的组数所以就把读入放在while循环里,并且读入的n不能是0
while (cin >> n && n)
{
stack<int> s;
int b[n + 1];
//给出的测试数据也不知道多少个所以就用while(1)+break来实现
while (1)
{
bool flag = true;
int a=1;
cin >> b[1];
//break的条件
if (b[1] == 0)
break;
else
{
for (int i = 2; i <= n; i++)
cin >> b[i];
//核心代码
for (int i = 1; i <= n; i++)
{
//遍历,此时b[i]为第i个出栈的
int k = b[i];
//判断比k小的还没入栈的
while(k>=a)
s.push(a++);
//如果栈顶和k相等,说明k之前的都是符合栈规则的
if(k == s.top())
s.pop();
else
{
flag = false;
break;
}
}
//注意No和Yes的大小写
if (!flag)
cout << "No" << endl;
else
cout << "Yes" << endl;
}
}
cout<<endl;
}
return 0;
}