判断出栈顺序是否正确

发布于:2022-12-07 ⋅ 阅读:(810) ⋅ 点赞:(0)

先说一下题目:

假设有一个栈S,每次我们可以把序列A(含N个元素)中的第一个元素移入栈S,也可以是从栈顶弹出一个元素放入出栈序列B。这
样,经过N次入栈和出栈操作后,我们可以得到一个出栈序列B。
现在,你的任务是对给定的一段序列B,,判断序列B是不是序列A的出栈序列。
输入描述:
第一行输入两个正整数N(N<10)、M(0<M<=1000),分别表示序列A的长度和序列B的数目。
第二行,输入N个正整数,以空格分开,为序列A。
接下来的M行,每行输入N个正整数,为要判断的出栈序列B。
输出描述:
M行,如果对应的序列B是序列A的出栈序列则输出“YES”,否则输出"NO”。
输入样例:
3 6
123
132
213
231
312
321
123
输出样例:
YES
YES
YES
NO
YES
YES

 

首先,我们就判断入栈顺序是逆序数为0的情况(1,2,3,……,n)。既然是判断出栈顺序,那么就会使用栈。我们可以使用for循环,在入栈的时候进行判断如果和出栈的数字相同,则入栈的数字就出栈,判断出栈的数字往后移动一位。

代码如下:

#include<iostream>
#include<stack>
using namespace std;
int main(){
	stack<int> st;//进行入栈和出栈的动作 
	int n,m=0,a=0;
	cin>>n;//入栈的位数 
	int num[n];//需要判断的出栈顺序 
	cin>>m;//需要判断的出栈顺序一共有几个 
	for(int j = 0;j < m;j ++){
		for(int i = 0;i < n;i ++){
		cin>>num[i];
	}
	for(int k = 0;k <n; k ++){
		st.push(k+1);
		while(st.top()==num[a]){
			st.pop();
			a++;
			if(st.empty()){
				break;
			}
			
		}
	}
	if(a<n-1){
		cout<<"NO";
	}else{
		cout<<"YES";
	}
	a=0;//a的作用是判断是否将出栈的数字判断完,完毕就说明出栈顺序正确 
}
return 0;
} 

执行如下:

 

这个是不符合题目要求的,毕竟我入栈的顺序是规定好的(1,2,3,……)。如果入栈顺序是(2,1,3,6,5,……),代码就不过关了。

其实在我这个代码的基础是加上一个输入入栈顺序的代码就能完成题目要求,其实我想说的是,在做题目时,我们可以讲题目简单化,先不考虑复杂情况,一步一步来。

代码如下:

#include<iostream>
#include<stack>
using namespace std;
int main(){
	stack<int> st;
	int n,m=0,a=0;
	cin>>n;
	int num[n];
	int num2[n];//规定的入栈顺序 
	cin>>m;
	for(int i = 0;i < n;i ++){//输入入栈顺序 
		cin>>num2[i];
	}
	for(int j = 0;j < m;j ++){
		for(int i = 0;i < n;i ++){
		cin>>num[i];
	}
	for(int k = 0;k <n; k ++){
		st.push(num2[k]);//之前是k+1,这里改成入栈的数字即可 
		while(st.top()==num[a]){
			st.pop();
			a++;
			if(st.empty()){
				break;
			}
			
		}
	}
	if(a<n-1){
		cout<<"NO";
	}else{
		cout<<"YES";
	}
	a=0;
}
return 0;
} 

执行如下:

 希望本篇文章可以帮助你,如有疑问,可与我一起探讨。如果不懂STL的,可看我总结的STL知识。

STL知识小结icon-default.png?t=M85Bhttps://blog.csdn.net/m0_67500944/article/details/126904238?spm=1001.2014.3001.5501

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到