当前课程知识点:数据结构(上) > 第四章 栈与队列 > (c3)栈应用:栈混洗 > 04C3-1 混洗
同学们好,在接下来这一节
我们将讨论一个与上一节
括号匹配问题非常相关的问题
也就是所谓的栈混洗问题
所谓的栈混洗
就是按照某种约定的规则
对栈中的元素进行重新的排列
初始情况下 所有的元素都存在栈A中
这里我们采用一个约定
也就是分别用尖括号和方括号
来表示栈的顶以及底
栈混洗的目标是将所有这些元素
都通过某种方式
转入到另一个初始为空的栈B中
为此我们也需要借助一个中转栈S
在整个混洗的过程中
我们允许的措施只有两种
第一种是由这个箭头来表示的
形式上说 也就是将A中的栈顶弹出
并随即压入中转栈S中
另一种允许的操作 则由这个箭头指示
也就是说 需要将S栈顶弹出
并随即转入栈B中
我们来看这样一个具体的实例
最初总共有四个元素
依次编号为1 2 3 4
接下来 在符合上述规则的情况下
经过一系列的push或者pop操作
最终将这四个元素成功地转入栈B中
构成一个新的排列
称作stack permutation
再次提醒大家注意
我们在记录栈B的内容时
依然采用这样的习惯
也就是分别用尖括号和方括号
来对应于栈的顶部和底部
因此我们在记录
栈A的内容和栈B的内容时
方向是正好颠倒的
不难理解 在遵守以上规则的前提下
同一输入序列
完全可能导出不同的栈混洗序列
就以刚才的1 2 3 4为例
按照刚才所述的过程
最终可以得到输出序列3 2 4 1
而如果我们每对S做过一次push
就随即做一次pop
我们就可以得到1 2 3 4
这样的一个顺序序列
反过来 如果我们连续地
执行完四次push之后
再连续地执行四次pop
我们就会得到一个完全颠倒的逆序序列
当然 在符合规则的情况下
其它的push和pop的组合
也会得到更多的可能的序列
那么我们可能会关心
对于长度为n的序列
可能的栈混洗总数
如果记作SP(n)的话 等于多少呢?
当然栈混洗的总数不可能超过全排列
也就是n的阶乘
那么准确地来说 又是多少呢?
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)计算
--演示
--(a)计算--作业
-(b)计算模型
-(b)计算模型--作业
-(c)大O记号
-(c)大O记号--作业
-(d)算法分析
-(d)算法分析--作业
-(e)迭代与递归
-(e)迭代与递归--作业
-(xc)动态规划
-- 演示
-(xc)动态规划--作业
-本章测验--作业
-(a)接口与实现
--02A-5 复制
-(a)接口与实现--作业
-(b)可扩充向量
-(b)可扩充向量--作业
-(c)无序向量
--02C-1 概述
--02C-3 插入
--02C-6 查找
--02C-8 遍历
-(c)无序向量--作业
-(d1)有序向量:唯一化
-(d1)有序向量:唯一化--作业
-(d2)有序向量:二分查找
-(d2)有序向量:二分查找--作业
-(d3)有序向量:Fibonacci查找
-(d3)有序向量:Fibonacci查找--作业
-(d4)有序向量:二分查找(改进)
-(d4)有序向量:二分查找(改进)--作业
-(d5)有序向量:插值查找
-第二章 向量(下)--(d5)有序向量:插值查找
-(e)起泡排序
--02E-2 改进
--02E-3 反例
-(e)起泡排序--作业
-(f)归并排序
-(f)归并排序--作业
-本章测验--作业
-(a)接口与实现
--03A-4 实现
-(a)接口与实现--作业
-(b)无序列表
--03B-2 查找
-(b)无序列表--作业
-(c)有序列表
--03C-3 查找
-(c)有序列表--作业
-(d)选择排序
--03D-1 构思
--03D-2 实例
--03D-3 实现
--03D-4 推敲
--03D-6 性能
-(d)选择排序--作业
-(e)插入排序
--03E-1 经验
--03E-2 构思
--03E-3 对比
--03E-4 实例
--03E-5 实现
-(e)插入排序--作业
-(xd)习题辅导:LightHouse
-本章测验--作业
- (a)栈接口与实现
--04A-1 栈
--04A-2 实例
--04A-3 实现
- (a)栈接口与实现--作业
-(c1)栈应用:进制转换
-第四章 栈与队列--(c1)栈应用:进制转换
-(c2)栈应用:括号匹配
-(c2)栈应用:括号匹配--作业
-(c3)栈应用:栈混洗
-第四章 栈与队列--(c3)栈应用:栈混洗
-(c4)栈应用:中缀表达式求值
-(c4)栈应用:中缀表达式求值--作业
-(c5)栈应用:逆波兰表达式
-第四章 栈与队列--(c5)栈应用:逆波兰表达式
-(d)队列接口与实现
--04D-1 接口
--04D-2 实例
--04D-3 实现
-第四章 栈与队列--本章测验
-(a)树
--05A-1 动机
--05A-2 应用
-(a)树--作业
-(b)树的表示
--05B-2 父亲
--05B-3 孩子
-第五章 二叉树--(b)树的表示
-(c)二叉树
-(c)二叉树--作业
-(d)二叉树实现
-(d)二叉树实现--作业
-(e1)先序遍历
-(e1)先序遍历--作业
-(e2)中序遍历
-第五章 二叉树--(e2)中序遍历
-(e4)层次遍历
-第五章 二叉树--(e4)层次遍历
-(e5)重构
-(e5)重构--作业
-本章测验--作业
-(a)概述
-(a)概述--作业
-(b1)邻接矩阵
-(b1)邻接矩阵--作业
-(c)广度优先搜索
--06C-2 策略
--06C-3 实现
--06C-5 实例
-(c)广度优先搜索--作业
-(d)深度优先搜索
--06D-1 算法
--06D-2 框架
--06D-3 细节
-(d)深度优先搜索--作业
-第六章 图--本章测验