题目

思路:题目格式怪怪的,本菜鸡是参考大佬的,这道题是本菜鸡在紫书上学的,最后问的学长弄懂的,具体思路写在注释上,主要是那4个if语句的理解,本蒟弱自己的理解写得,欢迎大佬指教

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1000+10;
int n,target[MAXN];
int flag = 1;
int main()
{
	int n;
	
	while(scanf("%d",&n),n)//当输入的n为0时就停止输入 
	{
		//第一次输入后,其余输入前要输出换行 
		if(flag) flag = 0;
		else printf("\n");
	while(scanf("%d",&target[1]),target[1])
	{
		stack<int> s;
		for(int i=2;i<=n;i++)
	{
		scanf("%d",&target[i]);
	}
		
	//A代表即将入栈的连续1~N的序号
	//B代表出站的目标顺序
	 
	int A = 1,B =1;
	int ok = 1;
	while(B<=n)
	{
		//前3个if,都是满足栈的性质的情况
		//如果前3个都不满足,则无法按照目标顺序输出
		 
		if(A==target[B]) // 这种比如目标为 1 2 3 4 5.则可以进一个出一个,则为Yes 
		{
			A++;
			B++;
		}
		//第一个if不满足后,因为最开始栈里面没序号元素,所以会直接到第三个if,让序号入栈
		//比如目标为5 4 3 2 1,会先循环5次让A:1 2 3 4 5先入栈
		//第六次循环发现target[1] ==5 == s.top(),则不断弹出元素序号,不断B++,直到
		//目标序号出站完成 
		//又例如5 4 1 2 3 这种目标,A:1 2 3 4 5 入栈,目标序号:
		//5==5 满足出栈,4==6满足出栈,1!=3不满足 ,ok=0,break; 
		else if(!s.empty()&&s.top()==target[B])
		{
			s.pop();
			B++;
		}
		else if(A<=n) s.push(A++);
		else 
		{
			ok= 0; 
			 break;
		}
	}
	printf("%s\n",ok? "Yes":"No");
	}
	
	}
	return 0;
 }