【1051】Pop Sequence (stack)

举报
野猪佩奇996 发表于 2022/01/23 01:52:55 2022/01/23
【摘要】 1.题目 https://pintia.cn/problem-sets/994805342720868352/problems/994805427332562944 给出容量max=M的栈,分别把1、2...

1.题目

https://pintia.cn/problem-sets/994805342720868352/problems/994805427332562944
给出容量max=M的栈,分别把1、2、…、n依次入栈,并给出一些列出栈顺序,判读判断出栈顺序是否合法。

2.思路

出栈是否合法要满足:(1)能出栈(2)不超过栈的限制容量。
思路:模拟,将1~n依次入栈,在入栈中——如果入栈的元素恰好等于出栈序列当前等待出栈的元素,就让栈顶元素出栈,同时把出栈序列当前等待出栈的元素位置标记后移1位
——举个栗子:出栈顺序为3 2 1 7 5 6 4时,1入栈,2入栈,3入栈,3出栈,1出栈,4出栈,5入栈,6入栈,7入栈,7出栈,此时栈的顶端元素为5,而序列要求此时6出栈(不可能),所以输出“NO”。
此时只要栈顶元素仍然等于出栈序列当前等待出栈的元素,则持续出栈。

(1)初始化栈,读入需要测试的出栈序列。
——以bool型变量flag表示出栈序列是否合法,若flag==true,则表示出栈序列合法,flag变量的初值为true。
以int型变量current表示出栈序列当前等待出栈的元素位置标记,初值=1;

(2)由于入栈顺序为1~N,因此从1至N枚举i,对于每个i,先将i入栈。如果此时栈内元素数目大于m个,则违反规则,置flag=false,退出循环;
否则,反复判断当前current所指出出栈序列中的元素(即带出栈元素)是否等于栈顶元素,若是,则让该元素出栈,并让current自增以指向下一个待出栈元素

(3)如果上述操作结束后栈空且flag ==true,则说明出栈顺序合法,输出“YES”,否则输出“NO”。

3.代码

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>  
#include <stack>
using namespace std;  
const int maxn=1010;
int arr[maxn]; //保存题目给定的出栈序列
stack<int> st;  //定义栈st,用以存放int型元素
 
int main(){   
	int m,n,T;
	scanf("%d%d%d",&m,&n,&T);
	while(T--){   //循环执行T次
		while(!st.empty()) {  //清空栈
			st.pop();
		}
		for(int i=1;i<=n;i++){
			scanf("%d",&arr[i]);
		}
		int current=1; //指向出栈序列中的待出栈元素
		bool flag=true;
		for(int i=1;i<=n;i++){
			st.push(i); //把i压入栈
			if(st.size()>m){ //如果此时栈中元素个数大于容量m,则序列非法
				flag=false;
				break;
			}
			//栈顶元素与出栈序列当前位置的元素相同时
			while(!st.empty()&&st.top()==arr[current]){
				st.pop();//反复弹栈并令current++
				current++;
			}
		}
		if(st.empty()==true&&flag==true){
			printf("YES\n"); //栈空且flag==true时表明合法
		}else{
			printf("NO\n");
		}
	}
	return 0;   
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

4.注意点

(1)题目对栈的大小有限制。
(2)在pop和top操作前记得判空,否则OJ会返回“答案错误”或“段错误”。
(3)步骤3必须判断是否栈空,否则会返回“答案错误”——因为如果在所有元素入栈后无法将所有元素出栈是不合法的。
(4)在每个出栈序列输入前一定要清空栈,否则如果上个出栈序列的结果没有被清空,会影响下个出栈序列的过程。

文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。

原文链接:andyguo.blog.csdn.net/article/details/112553216

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。