题目中说死胡同,所以使用栈模拟
#include<bits/stdc++.h>
using namespace std;
int n,f,zt=0,zv=1,p=0;
int arr[1100];
stack<int>v;
int main()
{
while(1)
{
cin>>n;
if(n!=0&&zt==1)//要求的每一区块换行,最后结束不换行,所以选择再非第一n不等于0的时候换行
{
cout<<endl;
}
if(n==0)//如果n等于0,结束
{
break;
}
else
{
zt=1;//第一次之外的置1
}
while(1)
{
cin>>f;//第一位,0为结束非0为继续
if(f!=0)
{
p=0;//用p来代表已出位置
arr[0]=f;
for(int i=1;i<n;i++)
{
cin>>arr[i];
}
zv=1;
while(1)
{
if(!v.empty())//序列中所有序号为出尽就放入多余序号,说明不能做到,结束
{
if(v.top()==n+1)
{
break;
}
}
if(p==n)//全部结束
{
break;
}
if(arr[p]==zv)//当前序号等于要出序号,直接出,无需入栈
{
p++;//后移
zv++;
}
else if(v.empty())//空栈则入栈
{
v.push(zv);
zv++;
}
else
{
if(v.top()==arr[p])//栈顶与要出序号相同则弹出栈顶
{
v.pop();
p++;
}
else//否则放入
{
v.push(zv);
zv++;
}
}
}
if(v.empty())//空栈则全部出栈,即成功
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
while(!v.empty())//清空栈
{
v.pop();
}
}
}
else
{
break;
}
}
}
}

京公网安备 11010502036488号