【SCAU大数据2班数据结构堂测】 火车进站 指针模拟出栈序列

描述
opPush市有一个著名的火车站,该火车站建于上个世纪。 由于资金有限及缺乏可用空间,此火车站只有一个轨道,如图所示。
在这里插入图片描述

该火车站的运作方式是每列火车从A方向进站,进站后的火车以某种方式进行重组后出站继续沿B方向行驶。 假设从方向A到达的火车有N( N <= 1000)列,进站的次序按照递增的顺序1,2,…,N 编号。
火车重组的负责人想知道这 N 列火车是否有可能在B方向上以a1,a2,…,aN 的次序出站继续行驶。 请你帮助他编写一个程序,决定是否有可能获得所需的列车出站顺序。

输入格式
输入由若干行组成。第一行输入N M两个整数,N表示有N列火车按照1,2,…,N的次序从A方向进站,M表示接下来有M行输入,每行输入有N个数,表示一种要判断是否可能的出站序列。
输出格式
输出M行,每行输出YES或NO,如果当前这种出站序列是可能的则输出YES,不可能则输出NO。
输入样例
5 2
1 2 3 4 5
5 4 1 2 3
输出样例
YES
NO

题意:给一个由1->n的入栈序列,问:题给的出栈序列是否合法

思路:

1.首先我们可以从最简单的情况开始分析,一定满足题意的一种出栈序列就是原序列,也就是进来一个出去一个。下面以n=6为例
在这里插入图片描述
2.然后我们假设有个出栈序列是4 3 5 6 2 1,很明显,这是乱序的,那怎么检验合法呢?不妨模拟一遍这个过程。
·首先是4出栈,这说明什么,说明1->3已经入栈了,这样才能让4出栈。如图,R指针相当于栈顶元素,现在栈顶在4这个位置,i=4(下标从1开始)
在这里插入图片描述
·然后3出栈,因为3就在原来4的旁边,所以出栈合法,就是前面把4pop掉,栈顶元素就是3 。我们把前面4走过的地方标记为-1,代表这个点我们已经走过了(或者说这个位置已经没有元素可以pop了)
在这里插入图片描述
·接着5出栈,这时候5在3的右边,我们发现只要当前的元素比栈顶元素大,那就不用管什么,直接把之间差的元素都push进来,自然大的那个就变成栈顶(这个例子还不直观,我们看1 3 2,1出栈,下一个是3,明显我们把1->3的元素都push进来,3就是栈顶,然后pop 3,再pop2),然后指针移动到5,同时标记过走过的点,代表该位置为空。
在这里插入图片描述
·下一个6就同理了。
在这里插入图片描述
·然后下一个元素是2,可我们现在的栈顶是6,怎么知道栈顶下一个就是2呢?这时候,我们前面的标记就起作用了,发现i 在【3,5】上都是-1

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值