1 /* 2 https://vjudge.net/problem/UVA-514 3 */ 4 #include "pch.h" 5 #include<iostream> 6 #include<cstdio> 7 #include<stack> 8 using namespace std; 9 const int MAXN = 1000 + 10; 10 int n, target[MAXN]; 11 12 int main() 13 { 14 15 while (scanf("%d", &n) == 1) // 输入,一共n辆火车 16 { 17 int isOnePart = 1; // 是否是同一次测试 18 if (n == 0) // 程序应当结束 19 break; 20 while (isOnePart) // 是同一次测试时 21 { 22 stack<int> s; 23 int A = 1, B = 1; // A:进C站顺序 1,2,3,...,n B:数组target的下标 24 for (int i = 1; i <= n; i++) 25 { 26 scanf("%d", &target[i]); // 输入出C站顺序 27 if (target[i] == 0) 28 { 29 isOnePart = 0; 30 printf(" "); // 注意! 31 break; 32 } 33 } 34 if (isOnePart == 0) // 退出此次测试,进入另一部分的测试 35 break; 36 int ok = 1; // 标志,是否可以按顺序出站 37 while (B <= n) // 判断当前出C站的车辆数是否达到总数 38 { 39 if (A == target[B]) // 要进站的火车与要出站的火车为同一辆,则进站后直接出站 40 { 41 A++; B++; 42 } 43 else if (!s.empty() && s.top() == target[B]) // 栈(站)非空,栈顶与要出站的火车相同,则出站 44 { 45 s.pop(); 46 B++; // 要出站的++ 47 } 48 else if (A <= n) // 要进站的与出站的不同,只进站,先等着,当栈顶与目标相同时再出(上一个if) 49 { 50 s.push(A++); 51 } 52 else 53 { 54 ok = 0; //正常结束循环为b=n, 若前几种情况都不符合,则不能按照要求顺序出站,break 55 break; 56 } 57 } 58 printf("%s ", ok ? "Yes" : "No"); 59 } 60 61 } 62 return 0; 63 }