题意:给你一个序列,问是否能够通过入栈出栈从1到n的顺序序列得到该序列
分析:模拟栈
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <cstdio> #include <cstring> #include <iostream> using namespace std; #define re(i,n) for(int i=0;i<n;i++) #define re1(i,n) for(int i=1;i<=n;i++) const int maxn =1010; int a[maxn] , sta[maxn]; bool pan(int a[],int n) { int top = 0; int j = 1; re1(i,n) { if(a[i] == j) j++; else if(top && sta[top] == a[i]) top --; else if(j<=n) { sta[++top] = j++; i--;} else return false; } return true; } int main() { int n; while(~scanf("%d",&n) && n) { while(scanf("%d",&a[1])) { if(a[1] == 0) { printf("\n"); break; } for(int i=2;i<=n;i++) scanf("%d",a+i); if(pan(a,n)) printf("Yes\n"); else printf("No\n"); } } return 0; }