题目
给定一个从1开始的连续整数列1、2、3、4…n。
将上述数列按顺序入栈,中途栈顶元素可以出栈。
再给定一个出栈序列,判断此序列是否合法。
例如,将n设为4。即得到数列1、2、3、4。
再给定出栈序列1、3、4、2。
可以看出,此出栈序列合法。
过程如下,先将数列1、2、3、4中的元素1入栈,再将其出栈。
然后将元素2、3入栈,将元素3出栈。
最后将元素4入栈,再把栈内的仅余元素4、2出栈。
整个过程中,元素按照1、3、4、2的顺序出栈。证明其合法。
Input
输入包括多组测试用例。
对于每组测试用例,第一行包含一个整数n<100,代表从1开始的连续整数列长度。
第二行包含一个长度为n的数列,代表出栈序列。出栈序列的各元素在区间[1,n]内且不重复。Output
若出栈序列合法,则输出Yes。
否则,输出No。
Sample Input 4
1 3 4 2Sample Output
YesHint
“Yes”,"No"注意大小写
判断原则:出栈序列中,元素i之后所有比i小的元素之间必须是降序排列的
#include<iostream>//出栈序列中,元素i之后所有比i小的元素之间必须是降序排列的
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
int flag1=0;
int flag2=0;//如果序列不合法为1
for(int i=0;i<n;i++)
{
flag1=0;
int temp,j;
for(j=i+1;j<n;j++)
{
if(a[j]<a[i])
{
flag1=1;
temp=a[j];
break;
}
}
if(flag1==1)
{
for(int k=j+1;k<n;k++)
{
if(a[k]<a[i]&&a[k]>temp)
{
flag2=1;
break;
}
else if(a[k]<a[i]&&a[k]<temp)
{
temp=a[k];
}
}
}
if(flag2==1)
break;
}
if(flag2==0)
cout<<"Yes"<<endl;
else if(flag2==1)
cout<<"No"<<endl;
}
}