形式化的描述:给你一个初始从小到大排列的1,2,3.……,N。问这排列经过栈(先进后出)的操作之后是否可以变成指定结果。
直接模拟就好了,我还想了各种情况来判断。。
#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;
}