栈混洗的甄别

自己看的大佬们请键盘侠留情

栈混洗的甄别

今天听了邓老师的慕课中的栈混洗的甄别,一开始看不懂在网上也找了很多帖子看,但是依然不太明白,后来自己想了一会觉得应该是对的,但是可能与邓老师的方法不一样(ps大神们见谅)。

首先和其他博客一样说一下栈混洗的概念(来源于邓老师的书上):

考察三个栈A、B、S,其中B、S一开始为空,A中则存放我们要进行栈混洗的初始元素。

设A中的元素为<a1,a2.....an]。这里尖括号<,方括号],分别表示表示栈顶和栈底。

栈混洗中只能进行S.push( A.pop() )弹出A中栈顶的元素并压入S中,以及B.push( S.pop() )弹出S中的栈顶元素并压入栈B。那么上述两次操作分别经过n次之后,栈A与S均可能为空,原来栈A中的元素全部转移到B中。B称为A的一个栈混洗。

设B中的元素为<b1,b2.....bn]。这里尖括号<,方括号],分别表示表示栈顶和栈底。

B一共拥有\frac{(2n!)}{(n+1)!n!}中可能结果。小于A中元素的组合数n!,那么如何分辨一个A中元素随机排列的B是不是A的栈混洗。

让我们先来回顾一下栈混洗的基本操作:

(1)将A中的栈顶元素取出压入S中,接下来有两种选择:

(2)将S中的栈顶元素取出压入B中

(3)继续将A中的栈顶元素取出压入S中。

这里B(待甄别)中的栈顶取出压入B2中。也就是将B中的元素颠倒放入B2中。
可以将栈混洗的甄别过程过程描述为:

a.将A栈顶元素取出压入S中

b.S中的栈顶B2中的栈顶比较

c.相同执行S.pop()、B2.pop(),返回b

d.不同返回a

最后S中的元素为空那么认为B1是A的一种栈混洗。否则不是

 

怎么理解上述过程呢?

首先a就是栈混洗中的(1)。如果说执行(2),那么B中的此时的栈顶肯定等于S原来的栈顶,这就相当于是B2此时的栈顶等于S中的栈顶。这个时候可以认为我所要甄别的栈混洗是A栈混洗中的一种,所以可以执行B2.pop()、S.pop()。

如果执行(3),那么相当于执行了d。

最后如果S中的元素为空那么成功。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值