一个长度为n的无重复序列入栈的所有出栈方式
例如1、2、3这三个数字,入栈并出栈共有5种方式,分别为:321、312、231、213、123。那么对于长度为n的无重复序列中所有的出栈方式有哪些呢?
为了设计计算的算法,我们可以用队列(queue)来模拟输入,队列的输出则按照原先序列的顺序。使用一个栈(stack)来模拟入栈和出栈,结果保存在另外一个队列(queue)中。
现在的问题来了,怎么样可以实现所有的出栈入栈操作。首先来看看出栈和入栈是怎么回事,对于123这个序列,1先入栈之后有两种选择,1出栈和2入栈,而若2已经入栈之后,在2出栈之前1则不能先行出栈,故对于1我们只需要考虑其在2入栈之前出栈的情况,若1在栈内时2入栈,则1与2只能看成一个整体。
这样就可以用递归的方式求解,伪代码如下:
-
dostack(输入队列,中间栈,输出队列)
-
if(输入队列为空)
-
if(中间栈为空)
-
输出输出队列中的结果
-
else
-
中间栈出栈,放入输出队列
-
dostack(输入队列,中间栈,输出队列)
-
else
-
if(中间栈非空)
-
新建输入队列2、中间栈2、输出队列2
-
中间栈2出栈并放入输出队列2
-
dostack(输入队列2,中间栈2,输出队列2)
-
输入队列出队一个数并压入中间栈
-
dostack(输入队列,中间栈,