形式化的描述:給你一個(gè)初始從小到大排列的1,2,3.……,N。問(wèn)這排列經(jīng)過(guò)棧(先進(jìn)后出)的操作之后是否可以變成指定結(jié)果。
直接模擬就好了,我還想了各種情況來(lái)判斷。。
#include <stdio.h>
#include <stdlib.h>
#define N 1005
int d[N], s[N], front, top;
int main()
{
// freopen("in", "r", stdin);
int n;
while(scanf("%d", &n), n)
{
while(scanf("%d", &d[1]), d[1])
{
front = top = 1;
for(int i = 2; i <= n; i++)
scanf("%d", &d[i]);
bool mk = 0;
for(int i = 1; i <= n; i++)
{
if(i > 1)
{
for(int j = 1; j < top - 1; j++)
{
if(d[i] == s[j])
{
mk = 1;
break;
}
}
if(mk) break;
}
for(; front <= d[i]; front++)
{
s[top++] = front;
}
top--;
}
if(mk) puts("No");
else puts("Yes");
}
puts("");
}
return 0;
}