题目链接:http://poj.org/problem?id=1363
题意:有一列火车,车厢编号为1~n,从A方向进站,向B方向出站。现在进站顺序确定,给出一个出站的顺序,判断出站顺序是否合理。
实际上是模拟栈的过程,而栈的特点是先进后出。另外一个麻烦的地方就是输入输出格式问题。
本题实现提供两种方法:没有用到STL栈和有用到STL栈
1 #include <iostream> // 法二:头文件多包含一个 #include <stack> 2 using namespace std; 3 4 const int maxn = 1000 + 5; 5 6 int main() 7 { 8 int A, B, i, n, top, target[maxn], stack[maxn]; // 法二:数组stack去掉, 变成 stack<int> s 9 while (scanf("%d", &n) && n) 10 { 11 while (1) 12 { 13 int flag = 1; 14 for (i = 1; i <= n; i++) 15 { 16 scanf("%d", &target[i]); 17 if (target[1] == 0) 18 { 19 flag = 0; 20 break; 21 } 22 } 23 if (!flag) 24 { 25 printf("\n"); 26 break; 27 } 28 int ok = 1; 29 A = B = 1; 30 top = 0; 31 while (B <= n) 32 { 33 if (A == target[B]) // 处理1~n的特殊情况
34 { 35 A++, B++; 36 } 37 else if (top && stack[top] == target[B]) // top && !s.empty() && s.top() == target[B] 出栈
38 { 39 top--; // s.pop(); 40 B++; 41 } 42 else if (A <= n) 43 { 44 stack[++top] = A; // s.push(A); 进栈 45 A++; 46 } 47 else 48 { 49 ok = 0; 50 break; 51 } 52 } 53 if (ok) 54 printf("Yes\n"); 55 else 56 printf("No\n"); 57 } 58 } 59 return 0; 60 }