题意:
n辆火车按顺序依次进站 判断给定的出站顺序是否可能
Sample Input
5
1 2 3 4 5
5 4 1 2 3
0
6
6 5 4 3 2 1
0
0
Sample Output
Yes
No
Yes
STL stack的操作:
empty() 堆栈为空则返回真
pop() 移除栈顶元素
push() 在栈顶增加元素
size() 返回栈中元素数目
top() 返回栈顶元素
#include <cstdio>
#include <stack>
using namespace std;
const int MAXN =1000 + 10;
int n, target[MAXN];
/*
target : 出站序列
s :站内车厢序列
A :要入站d的车厢号 A=A[i]
B :出站车厢号 target[B]
*/
int main()
{
while(scanf("%d",&n) == 1&&n > 0) {
stack<int> s;
while(scanf("%d", &target[1]) == 1 && target[1] != 0) {
int A = 1, B = 1;
for(int i = 2; 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;}
/*
三种情况:1)当前要入站的车厢即为当前要出站的车厢
2)如果站内还有车厢且栈顶元素恰好为当前要出站的车厢
3)当前要入站的车厢进站
4)则无法达到要求
*/
}
printf("%s\n", ok ? "Yes": "No");
}
printf("\n");
}
return 0;
}