栈 - 关于出栈序列,判断合法的出栈序列
文章目录
- 1 引例
- 2 做题方法
- 3 原因
- 3.1 选项D(4 3 1 2)的模拟
1 引例
(例)设栈的入栈序列是 1 2 3 4,则下列不可能是其出栈序列的是( )。
A. 1 2 4 3
B. 2 1 3 4
C. 1 4 3 2
D. 4 3 1 2
E. 3 2 1 4
一般人看到此类题目,都会拿起草稿纸,将各个选项都模拟一遍选出正确答案
这当然可以得出正确的答案 (D )
但当元素个数过多的时候,这个方法不可取,而且,这种人工模拟过程浪费时间且容易出错,下面将介绍一种简单的做题方法。
2 做题方法
按顺序入栈的序列,任意元素 e ,比 e 先入栈的元素,并且比 e 后出栈的元素,一定是逆序的。
读起来有点绕口,那么先记下 “ 后出先入逆序 ”
1、以最上面的例题为例,若要写出所有以 1 2 3 4 为入栈顺序的出栈序列
暴力求解:4个元素一共有 A44A_4^4A44 共24种排列(下表加粗斜体的排列为合法排列)
1234 | 1243 | 1324 | 1342 | 1423 | 1432 |
2134 | 2143 | 2314 | 2341 | 2413 | 2431 |
3124 | 3142 | 3214 | 3241 | 3412 | 3421 |
4123 | 4132 | 4213 | 4231 | 4312 | 4321 |
表格中加粗斜体的排列为合法排列一共有 14 个
现在可以随意选一个序列来理解一下什么是 “ 后出先入逆序 ”
比如序列:3 1 2 4
- 选择任意元素 e ,这里选择 3
- 比 3 后出栈的有三个元素 1 2 4
- 其中比 3 先入栈的有两个元素 1 2
- 但是 1 2 是正序的,而不是逆序的
- 所以这个序列不是合法出栈序列
(注:可以利用递归设计出相应的算法来判断所有合法序列)
2、若只要求出一共有多少个合法出栈序列
将元素个数替换 n 计算即可,计算得 14
该公式称为卡塔兰数(Catalan number)公式,了解更多 点这里
注:上式中的括号上下两个数(2n和n)代表数学中排列组合公式中的C上下两个数,即用组合公式来求即可。
3 原因
3.1 选项D(4 3 1 2)的模拟
1、将 1 2 3 4 顺序依次入栈:
2、弹出栈顶元素 4:
3、弹出栈顶元素 3:
接下来栈内只剩下元素 1 和 2 ,并且 2 在栈顶
所以说 D (4 3 1 2) 选项的出栈顺序最后的 1 和 2 是无法完成的
可以发现:
如果把最后两个元素的顺序逆置一下,就可以完成了
栈 - 关于出栈序列,判断合法的出栈序列相关推荐
- 【2020团队天梯赛模拟题L2-1】 根据输出序列判断是否是栈的输出结果(C语言)
[2020团队天梯赛模拟题L2-1] 根据输出序列判断是否是栈的输出结果(C语言) (因为找不到题目只有回忆写题了)题目描述:输出m,n,k3个整数,其中m代表栈的最大存储容量,n代表输出序列的个数, ...
- PAT甲级1051 Pop Sequence:[C++题解]模拟栈、判断序列是否是合法的出栈序列
文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: 题意:将1~N压栈,判断给定序列是否是合法的出栈序列. 对于序列1~N中的每个值i,先将其压入栈.然后对于它就有两种处理方法:要么压 ...
- 数据结构学习笔记——栈的基本知识和顺序存储结构实现栈(顺序栈)
目录 一.栈 (一)栈的概念 (二)栈的排列 (三)共享栈 (四)栈的常见应用 二.顺序栈的定义 三.顺序栈的初始化 四.判断顺序栈是否为空栈 五.判断顺序栈是否为满栈 六.进栈(插入操作) 七.出栈 ...
- 车厢调度(判断是否为合法的出栈序列)
时间限制: 1 Sec 内存限制: 128 MB [提交] [状态] 题目描述 有一个火车站,铁路如图所示,每辆火车从A驶入,再从B方向驶出,同时它的车厢可以重新组合.假设从A方向驶来的火车有n节(n ...
- 序列元素IT面试题——判断合法出栈序列
本文纯属个人见解,是对前面学习的总结,如有描述不正确的地方还请高手指正~ 在技巧笔试口试上,我们常常会碰到这样一类题型,如给你一个入栈序列,然后再让你判断几个序列是否有可能为它的出栈序列,如: 入栈序 ...
- 数据结构:判断堆栈出栈序列是否有效
描述:如果以序列"1,2,3,4"作为一个栈(初始为空)的输入,那么可得到输出序列"1,2,3,4"或"4,3,2,1"或"2,3 ...
- 合法的出栈顺序判断(c++)
[问题描述] 将1,2...n依次入栈,并给出一段序列,用空格隔开,请判断这种出栈顺序是否存在. [输入] n和num[] [输出] "YES"or"NO" # ...
- 栈的压入序列和弹出序列是否匹配
给两个数组pushed和poped,其中pushed为栈的压入序列,popped为栈的弹出序列,判断第一个序列是否是第一个序列的弹出序列.假设压入栈的所有数字均不相等. 分析:辅助栈判断. class ...
- c语言输出合法的出栈算法,c语言栈的实现以及操作
此文章包含了栈的结构体实现,单数据类型实现,以及清空,判空,入栈,出栈,求栈顶元素的实现 栈作为一个最简单的数据结构,实现起来也非常容易,想想现在有一摞盘子,每次只能取走或放一个盘子且只能最上面进行操 ...
最新文章
- 如何提升 Linux 服务器安全的开源工具和技巧?
- python编程程序设计_程序设计入门—Python
- 火爆背后的挑战:直播平台的高并发架构设计
- 打通NTFS权限 文件共享各取所需
- 计算 JS 数组中最大最小值
- 【单元测试框架unittest】
- 6000个边缘Kubernetes节点驱动城市80万次智能停车,如何成为可能?
- android中自定义 toast,android 自定义Toast样式和显示方式
- 卡巴斯基7.0如何设置授权文件
- 女人总浑身都没有力气怎么回事儿
- android 根据颜色值修改背景图的背景色 最简单方法
- 物联网卡是做什么用的
- 如何用摄像头来测距(opencv)
- 01 Spark组件 —— Scala导言
- 吴恩达Deep learning笔记(一)
- Machine Learning 机器学习
- 激光雷达初体验 - Ubuntu 18.04 + 思岚科技 RPLIDAR A1M8 + ROS 上手使用
- 占位图和图片懒加载项目实战详解
- 汽车标准:全球EMC试验标准汇总。
- 地下水环境监测技术规范中采样部分