ZJU数据结构 02-线性结构4 Pop Sequence (25 分)

Reference

·出栈顺序的理论依据 入栈出栈规律·
·栈所有出栈方法的数量 给定入栈顺序,求所有可能的出栈顺序
·利用栈模拟的解法 (同)
C风格写法 02-线性结构4 Pop Sequence
该文章对栈进行了封装,看起来比较清楚
我的直接用一个数组stack和一个浮标top模拟了栈。

C++ with STL 02-线性结构4 Pop Sequence (25分)
·枚举栈所有可能的出栈序列
1,2,3,4按顺序入栈,出栈顺序随意,列出所有可能情况,这个算法怎么写 问题点数:20分.

Main Part

提供两种解法
  1. 利用栈模拟
  2. 利用栈pop的规律手动检查

之前还在别处看到过一个出栈规律的总结,
任何出栈的元素后面出栈的元素必须满足以下三点:
1、在原序列中相对位置比它小的,必须是逆序;
2、在原序列中相对位置比它大的,顺序没有要求;
3、以上两点可以间插进行。

看了半天没看懂,“它”指什么,如果指出栈的那个元素,那就并不对。
后来看了别的帖子,才知道他想说的是

对于出栈列表中的某个元素,在其后出栈 并且 比这个元素小 的所有元素 组成的列表中,任意两者的相对位置必须和入栈时相反。
仅需满足这一条即可。

解释:该元素被出栈,则比其小的元素一定入栈过(未必现在还在栈里)。之后出栈的序列中出现了比该元素小的元素,则说明该元素出栈时,较小的元素还在栈内,则多个较小的元素之间就要符合栈的规律:先入后出,后入先出。
譬如入栈序列ABCDEF,若我们只知道出栈序列为FE…,则当E出栈时,我们并不知道D,C是否在栈内。但若我们知道出栈序列是FEDC…时,我们就知道在E出栈时,D,C还在栈内,则D要在C之前出来,即与先C后D的入栈顺序相反。

反例:
一个栈的入栈序列为ABCDEF,则不可能的出栈序列是(FECDBA)
Solution: 从出栈列表开始检查,第一个元素是F,在其后比F小的元素(在F之前入栈)是E,C,D,B,A,而其中任意两者的相对位置关系并不满足逆序,因为对于C和D来说,其入栈的顺序是先C后D,出栈的顺序就一定是先D后C。

顺带一提,栈可能的出栈顺序有
N = ( 2 n ) ! n ! ∗ ( n + 1 ) ! N=\frac{(2n)!}{n!*(n+1)!} N=n!(n+1)!(2n)!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值