给定一个最大容量为 M 的堆栈,将 N 个数字按 1, 2, 3, …, N 的顺序入栈,允许按任何顺序出栈,则哪些数字序列是不可能得到的?例如给定 M=5、N=7,则我们有可能得到{ 1, 2, 3, 4, 5, 6, 7 },但不可能得到{ 3, 2, 1, 7, 5, 6, 4 }。

输入格式:

输入第一行给出 3 个不超过 1000 的正整数:M(堆栈最大容量)、N(入栈元素个数)、K(待检查的出栈序列个数)。最后 K 行,每行给出 N 个数字的出栈序列。所有同行数字以空格间隔。

输出格式:

对每一行出栈序列,如果其的确是有可能得到的合法序列,就在一行中输出YES,否则输出NO。

输入样例:

5 7 5
1 2 3 4 5 6 7
3 2 1 7 5 6 4
7 6 5 4 3 2 1
5 6 4 3 7 2 1
1 7 6 5 4 3 2

输出样例:

YES
NO
NO
YES
NO

借鉴了https://blog.csdn.net/wenqiang1208/article/details/75578653的思路

直观的思路就是将入栈序列一个一个入栈,与出栈序列相比较,一样就出栈,不一样就继续入栈,当入栈序列和出栈序列都为空时,表示出栈顺序合法。
——https://blog.csdn.net/wenqiang1208/article/details/75578653

需要倒一下待判断的序列,先将3 2 1 7 5 6 4入栈,再依次出栈,并入新栈,获得栈底为4->栈顶为3。
以下为本题的实现

#include <iostream>
#include <stack>
using namespace std;
stack <int> popf;
stack <int> popv;
stack <int> pushv;void check(int m,int n);
int main(){int m,n,k;int i;cin>>m>>n>>k;check(m,n);for(i=1;i<k;i++){cout<<endl;check(m,n);}return 0;
}
void check(int m,int n)
{int i,t,flag=1;for(i=0;i<n;i++){cin>>t;popf.push(t);}for(i=0;i<n;i++){popv.push( popf.top() );popf.pop();}for(i=1;i<=n;i++){if(pushv.size()>=m){flag = 0;break;}pushv.push(i);while(!pushv.empty()&&pushv.top() == popv.top()){pushv.pop();popv.pop();}}if(popv.empty()&&flag)cout<<"YES";elsecout<<"NO";while(!popv.empty()){popv.pop();}while(!pushv.empty()){pushv.pop();}
}

2-10 [搞定!]出栈序列的合法性 (20 分)相关推荐

  1. 面试题之判断栈的入栈和出栈序列的合法性

    完整题目是这样的:给我们两个序列,第一个序列表示栈的压入顺序,然后让判断第二个序列是不是是否是该栈的弹出序列.现设第一个序列为[1,2,3,4,5],第二个序列为[3,2,5,4,1],可以看出这个出 ...

  2. 数据结构实验之栈与队列七:出栈序列判定

    Description 给一个初始的入栈序列,其次序即为元素的入栈次序,栈顶元素可以随时出栈,每个元素只能入栈依次.输入一个入栈序列,后面依次输入多个序列,请判断这些序列是否为所给入栈序列合法的出栈序 ...

  3. 数据结构实验之栈七:出栈序列判定

    题目描述 给一个初始的入栈序列,其次序即为元素的入栈次序,栈顶元素可以随时出栈,每个元素只能入栈依次.输入一个入栈序列,后面依次输入多个序列,请判断这些序列是否为所给入栈序列合法的出栈序列. 例如序列 ...

  4. 详解+G - 数据结构实验之栈与队列七:出栈序列判定

    理解: 出入栈规律之一,如果前面有一个比较大的数,后面有连续的递增顺序,递增顺序>=2个小于前面比较大的数,那么此出栈顺序不可能实现.比如4,1,2,3,5. 思路:输入一个数,然后不断按照顺序 ...

  5. 数据结构:判断堆栈出栈序列是否有效

    描述:如果以序列"1,2,3,4"作为一个栈(初始为空)的输入,那么可得到输出序列"1,2,3,4"或"4,3,2,1"或"2,3 ...

  6. 卡特兰数问题——一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?

    一个栈(无穷大)的进栈序列为1,2,3,-,n,有多少个不同的出栈序列? 常规分析 首先,我们设f(n)=序列个数为n的出栈序列种数.(我们假定,最后出栈的元素为k,显然,k取不同值时的情况是相互独立 ...

  7. 给定入栈序列,判断一个串是否为出栈序列

    剑指offer22:给定入栈序列,判断一个串是否为出栈序列 public static boolean isOutStackSequence(int[] Spush, int[] Spop) {if ...

  8. 栈 - 关于出栈序列,判断合法的出栈序列

    文章目录 1 引例 2 做题方法 3 原因 3.1 选项D(4 3 1 2)的模拟 1 引例 (例)设栈的入栈序列是 1 2 3 4,则下列不可能是其出栈序列的是( ). A. 1 2 4 3 B. ...

  9. PAT甲级1051 Pop Sequence:[C++题解]模拟栈、判断序列是否是合法的出栈序列

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: 题意:将1~N压栈,判断给定序列是否是合法的出栈序列. 对于序列1~N中的每个值i,先将其压入栈.然后对于它就有两种处理方法:要么压 ...

最新文章

  1. mongoose简单使用
  2. 数据库插入时,标识列插入显式值
  3. grafana安装升级部署
  4. sizeof 计算struct大小
  5. 2009 年 5 月 忙碌的一个月
  6. python中rgb_python - 图像的RGB矩阵
  7. 跑步运动轨迹计时小程序源码
  8. 异常记录——使用Mybatis报BindingException
  9. [深入研究4G/5G/6G专题-35]: URLLC-6-《中国联通5G URLLC技术白皮书3.0版本》解读-2-无线侧关键技术
  10. 51单片机 矩阵键盘
  11. php图片反色特效,PHP实现对图片的反色处理功能【测试可用】
  12. 南京师范大学地图学与地理信息系统专业《地理信息系统原理》研究生(硕士)期末试卷
  13. 有哪些管理类书籍值得推荐?
  14. ffmpeg命令操作 合并视频 取图片帧数 获取音频
  15. 拉格朗日/柯西中值定理与高考数学计算
  16. Rhino6.25软件安装教程|兼容WIN10
  17. Win10禁用管理员帐户后无法进入的两种解决方法
  18. 《失业的程序员》(十五):商业头脑
  19. 论文排版1-图片-eps、pdf格式转换
  20. java List去除重复数据的五种方式

热门文章

  1. 私有5g网络_Verizon与诺基亚合作部署私有5G网络
  2. connect ECONNREFUSED 151.101.0.133:443 | spawn xxx ENOENT
  3. html中内联元素和块级元素的区别(整理版)
  4. jdk8 list转Map
  5. C# 系统环境变量读取
  6. C++学习笔记之对文件的操作2
  7. TCP面向连接中的“连接”和“可靠”与“不可靠”
  8. centos7 frp内网穿透
  9. Ms sqlserver闪退----“转载的知识”
  10. python输入日期时间转换格式_python如何格式化日期?