编程基础 - 栈的应用 - 混洗(Stack Shuffling)

本文介绍编程基础中的栈应用——混洗序列,探讨了如何求解出栈序列的所有可能及其数量。通过C++代码展示了如何计算和列举特定元素个数的出栈(入栈)序列。
摘要由CSDN通过智能技术生成

编程基础 - 栈的应用 - 混洗(Stack Shuffling)

返回分类:全部文章 >> 基础知识

返回上级:编程基础 - 栈(Stack)



1 混洗简述

“混洗”原意就是重新洗牌。

在栈的混洗中,假定元素为1到n,入栈顺序也为1到n,在应用中有可能会需要这些问题的答案:

  • (1) 出栈序列共有多少种可能?

  • (2) 求出所有出栈(入栈)序列。

  • (3) 给出一个出栈序列,问栈的容量最少需要多少?

  • (4) 给出一个(或多个)出栈序列,问此序列是不是(哪一个序列不是)原序列混洗得到的?

之后我们主要进行问题(1)和问题(2)的求解,代码将使用C++。


2 出栈序列共有多少种可能?

在元素个数较少的情况下,我们可以写出它们的出栈顺序,例如:

  • 元素个数为2时,入栈序列为[1, 2],出栈顺序为:

    • [1, 2]:入1、出1、入2、出2
    • [2, 1]:入1,入2,出2,出1
  • 元素个数为3时,入栈顺序为[1, 2, 3],出栈顺序为:

    • [1, 2, 3]:入1,出1,入2,出2,入3,出3
    • [1, 3, 2]:入1,出1,入2,入3,出3,出2
    • [2, 1, 3]:入1,入2,出2,出1,入3,出3
    • [2, 3, 1]:入1,入2,出2,入3,出3,出1
    • [3, 2, 1]:入1,入2,入3,出3,出2,出1

同理,可以写出元素个数为4时的出栈顺序。

有了这些,我们可以观察其规律,推导更多元素的出栈顺序。

注意:元素个数0时,有1种出栈顺序(空)。元素个数1时,同样也只有1种出栈顺序(就是1本身)

我们假设元素个数为n,出栈顺序共有m种,则:

(提示:公式在CSDN的app中可能显示乱码,请在网页中打开)

n = 0 → m 0 = 1 n = 1 → m 1 = 1 n = 2 → m 2 = 2 n = 3 → m 3 = 5 ⋮ → ⋮ n → m n \begin{array}{cc} n=0 & \to & m_0=1 \\ n=1 & \to & m_1=1 \\ n=2 & \to & m_2=2 \\ n=3 & \to & m_3=5 \\ \vdots & \to & \vdots \\ n & \to & m_n \end{array} n=0n=1n=2n=3nm0=1m1=1m2=2m3=5mn

我们取第一个元素(即1)的位置来做推导:

  • 当n为2时,元素1的出栈位置的下标为[0, 1]

    元素1的位置 左侧出栈序列个数 右侧出栈序列个数 总序列个数
    0 n = 0 n=0 n=0 , m 0 = 1 m_0=1 m0=1 n = 1 n=1 n=1 , m 1 = 1 m_1=1 m1=1 m 0 × m 2 = 1 m_0 \times m_2 = 1 m0×m2=1
    1 n = 1 n=1 n=1 , m 1 = 1 m_1=1 m1=1 n = 0 n=0 n=0 , m 0 = 1 m_0=1 m0=1 m 1 × m 1 = 1 m_1 \times m_1 = 1 m1×
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值