对于栈,一个常见的问题是:给定一个序列a0,a1,a2,a3...an依次顺序入栈,在元素顺序入栈的过程中,栈中任意一个元素可以选择是否出栈,则其共有几种出栈的可能,给定的出栈序列中,哪种是不可能的。
针对以上的这个问题(实际上是两个),对于出栈的可能的种类数目,其总共有
(S=frac{1}{n+1}inom{2n}{n}=frac{(2n)!}{(n+1)!n!})种详见卡塔兰数问题wiki链接。
其中,关于哪种出栈序列是不可能的问题,其判定的情况为,对于出栈序列中的一个数ak,(0<=k&&k<=n),若其后面出现了一个数az满足k-z>=2,则看入栈序列中夹在ak和az间的数是否已经出过栈,若已经出过栈,则其出栈序列为可能的,否则为不可能的出栈序列。
例如:
对于序列1,2,3,4,5将其依次入栈,判断如下两种出栈序列是否为可能的
1: 1,5,3,4,2
2: 1,3,5,2,4
对于出栈序列1:其为不可能的序列,因为在出栈序列中出现了“5,3”这样的出栈顺序,而在原序列(入栈序列)中,夹杂在“5,3”这样的序列的数“4”并没有先于“5”这个数出栈,为此,其为不可能的出栈序列
对于出栈序列2:其为不可能的出栈序列,因为在出栈序列中出现了“5,2”这样的出栈顺序,而在原序列(入栈序列)中,夹杂在“5,2”这样的序列的数“3,4”中的数“4”并没有先于“5”这个数出栈,为此,其为不可能的出栈序列
对于栈的应用有很多,例如:大数加法(超过long,double中能表示的范围,当然,这里针对java等而言,对于python,我笑~),括号分隔符匹配问题,双栈法求表达式的值,逆波兰算法,递归函数调用之间的链接和信息交换,二叉树的非递归遍历等等,只要满足后进先出的原则的均可使用栈来进行实现。
点击此进行查看