题目大意:1-n这n个数按照升序序列进栈,问是否能以给出的序列出站
思路:栈
本来一开始以为只能用DFS的方法做,后来看了看dalao的文章才知道其实不用。期望序列我们储存在tar数组中,我们用一个变量idx,记录下一次要与tar匹配的值的下标,即需要满足 栈顶元素==tar[idx],这样只要栈顶满足这样的关系,就一直循环判断,知道栈空或者栈顶不满足这样的关系。
代码:
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int n , top;
int tar[N] , stk[N];//tar是目标序列,stk是栈,也可以用STL中的stack
inline void init()//初始化
{
top = 0;
memset(stk , 0 , sizeof stk);
}
int main(void)
{
while(scanf("%d",&n) != EOF && n != 0)
{
while(scanf("%d",&tar[0]) , tar[0])
{
init();
for(int i = 1 ; i < n ; ++ i) scanf("%d",&tar[i]);//输入数据
int idx = 0 , i = 1;//i代表的是下一个要往栈中插入的元素
while(i <= n && idx < n)
{
stk[top ++] = i;//先插入i
//如果栈顶满足关系,那么就不断弹出栈中的元素,直到栈空或不满足关系
while(top && stk[top - 1] == tar[idx]) top -- , idx ++;
i++;//更新i
}
//输出结果
if(top) puts("No");
else puts("Yes");
}
puts("");
}
return 0;
}