铁路(栈)

来源:互联网 发布:逆袭网络剧第一集 编辑:程序博客网 时间:2024/06/10 14:56

某城市有一个火车站,有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;}