给一个出栈顺序,问其是否可以由1,2,3,4,5. ....... N通过进栈得到,只会用堆栈模拟。。。。
/*===============================================================
* Copyright (C) 2012 All rights reserved.
*
* file: uva514.cpp
* author: ivapple
* date: 2012-09-19
* description:
*
* update log:
*
================================================================*/
#include <cstdlib>
#include <cstdio>
//#include <stack>
#include <iostream>
#define out(x) (cout<<#x<<": "<<x<<endl)
#define FOR(i,s,t) for(i=s; i<t; i++)
using namespace std;
template<class T>void show(T a, int n){int i; for(i=0;i<n;i++)cout<<a[i]<<" ";cout<<endl;}
template<class T>void show(T a, int r, int l){int i; for(i=0;i<r;i++)show(a[i],l);cout<<endl;}
const int kMaxNum = 1000;
int input[kMaxNum+5];
int N;
int stack[kMaxNum+2];
int front = 0;
int top = 0;
bool Check()
{
int i = 0;
int st;
front = 1;
top = 0;
while(1)
{
while (!top || stack[top-1] < input[i]) stack[top++] = front++;
st = stack[--top];
if (st > input[i])
return 0;
if (st == input[i])
i++;
if (i == N) return 1;
}
}
int main()
{
int num;
int i;
#ifndef ONLINE_JUDGE
freopen("test.txt", "r", stdin);
#endif
while (scanf("%d", &N)&&N)
{
while(scanf("%d", &num)&&num)
{
input[0] = num;
for (i=1; i<N; i++)
scanf("%d", &input[i]);
if (Check())
printf("Yes\n");
else
printf("No\n");
}
printf("\n");
}
return 0;
}