栈----出栈序列合法判断(C++)

题目

给定一个从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 2

Sample Output
Yes

Hint
“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;
	}
}

猜你喜欢

转载自blog.csdn.net/Huo6666/article/details/112853190
今日推荐