下面代码初始化好像是错的
//辣鸡代码....自己写的别看了
//可怕 的 一点:不要根据数据找规律.....
//而是要模拟代码的实现过程.. 比如这个是入栈的过程,不妨让计算机跑一次!!!而不是我第一遍代码发现变小就是压进去,变小就 是移出来
//这样实现起来也特别麻烦..又比如说上午那个1/2 ,用枚举是访问遍历每个x,而不是找找什么规律谁比谁大
//↑效率就低了而且拔毛什么的 又要特判了吧
//尤其是你自己又是n+1又是什么的就该觉得要换方向了
#include<iostream>
#include<stack>
using namespace std;
int target[1005];
int main()
{
int n;
while (cin >> n&&n != 0){
stack<int> s;
int a = 1, b = 1;
///以及.... 这个从1开始的序列怎么用,最开始想用a[i]=i?怎么记录?是用0 还是-1?
//实际上直接和A关联起来的A++就能解决了= =.. 既能代表那个序列,也能记录是否被访问
while (1){
cin >> target[1];
if (target[1] == 0)break;
for (int i = 2; i <= n; i++)
cin >> target[i];
bool q = true;
while (b <= n)
{
if (a == target[b])//这个就是直接溜出来了
{
a++;//回合数加一,target也加,符合条件了..
b++;
}
//对于一个元素,除了push进去,就是直接溜出来,所以溜出来的话和a相等诶.. a就相当于第几回合(过程
else if (!s.empty()&&s.top() == target[b] )//栈里面有元素->已经有被压进来的了,可以输出了->
//如果栈顶 的元素正好是你想要的那个->【栈如果是空的找top,很可怕。。。。】
{
s.pop(); b++;//b++就是target 里面又 有了一个符合的,可以继续往回检验了,a
}//每个target[b]都会问到
else if (a <= n)
{
s.push(a);
a++;//对于a 没溜出来,就压进去
}
else
{
q = false;
break;
}
}
if (!q)cout << "No" << endl;
else cout << "Yes" << endl;
//cout<<q?"Yes":"No"<<endl;
}
}
return 0;
}//辣鸡代码....自己写的别看了
//可怕 的 一