某城市有一个火车站,有n节车厢从A方向驶入车站,按进站的顺序编号为1~n。现让它们按照某种特定的顺序进入B方向的铁轨并驶出车站。为了重组车厢,你可以借助中转站C。在程序中输入车厢数目和出站的特定顺序,如果可以则输出Yes,否者输出No。
样例输入:
5
1 2 3 4 5
5
5 4 1 2 3
6
6 5 4 3 2 1
样例输出:
Yes
No
Yes
分析:
考虑好入栈时会有哪些情况。
#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
const int MAXN = 1000 + 10;
int n, target[MAXN];
int main() {
while (scanf("%d", &n) == 1) {
stack<int> s;
int A = 1,B = 1;
for (int i = 1; i <= n; i++)
scanf("%d", &target[i]); //输入的出栈顺序
int ok = 1;
while (B <= n) {
if (A == target[B]) { A++; B++;} //当入栈后又直接出栈的情况
else if (!s.empty() && s.top() == target[B]) { s.pop(); B++;} //当栈顶元素等于出栈顺序元素
else if (A <= n) s.push(A++); //入栈后没有直接出栈
else { ok = 0; break; }
}
printf("%s\n", ok ? "YES" : "NO");
}
return 0;
}