Roh*_*ain 4 algorithm stack permutation catalan
任何人都可以解释算法,以便在仅使用单个堆栈时生成可能的排列,并且push和pop是唯一允许的操作.已经搜索了很多,但没有明确的答案.此类排列的总数也由加泰罗尼亚数字给出.但我没有得到证据.请尽可能解释一下.
谢谢!!
此问题使用输入队列和输出队列以及堆栈.
操作是"将项目从输入队列推送到堆栈"和"将项目从堆栈弹出到输出队列".
1 2 3
output ______ ______ input
\ /
<--+ | +---
pop | | | push
| | v
stack
Run Code Online (Sandbox Code Playgroud)
例如,使用输入1 2 3,您可以2 1 3按以下顺序获取输出:
但是如果你试图生成,你会很难3 1 2.
如何生成这些操作可能产生的所有排列?好吧,递归执行是微不足道的:在任何给定状态("状态"由输入队列,堆栈和输出队列的内容组成)中,最多可以执行两种可能的操作(可以推送)如果输入队列中至少有一个项目;如果堆栈中至少有一个项目,则可以弹出),这将最多为您提供两个可供探索的新状态.
有关此问题的进一步的细节,并与Catalan数的关系,去找Knuth的"计算机程序设计艺术",第1卷的副本 - 它在§2.2.1讨论(第3版); 请参阅第242-243页的练习2 - 5(以及第240页的更好的图表版本!).