【栈的应用】栈的出栈序列问题研究

来源:互联网 发布:js 面向对象 视频 编辑:程序博客网 时间:2024/05/01 09:12


在平日的关于栈学习当中,我们会经常遇到关于栈的出栈序列的问题。

虽然这些问题很多可以通过穷举法实现解决。

但是遇到了考试或者面试的时候,往往穷举法会花费大量的时间。

于是寻找类似问题的规律往往是更高效的解决办法。


在首先,我们先判断出栈的元素的顺序是否合法



一、出栈序列的合法化问题:


例题1:若元素进栈的 顺序为1-2-3-4,能否得到出栈序列为3-1-2-4?

分析:若出栈序列的首个元素为3,则可以知道在栈内的元素如下

(栈底)1-2(栈顶)。则第二个出栈元素可以是已在栈顶的2,也可以是在栈外的4。不可能是在非栈顶的1。

所以答案:否。


例题2:已知元素进栈序列为1-2-3-4,请问如何得到1-3-4-2的出栈序列?

分析:已知入栈和出栈首个元素是1,则可以知道元素1在进栈后立即出栈。则栈的操作为

入-出

第二个出栈的元素是3,则可以知道元素3在出栈时候栈内尚有元素2。则栈的操作为2入栈,3入栈,3出栈,得出操作序列

入-出-入-入-出

第三个出栈的元素是2,2则在栈顶,则可以知道下一个操作为出栈

入-出-入-入-出-出

最后一个元素为在栈外的4,则可以知道栈的操作为4入栈,4出栈,得出操作序列

入-出-入-入-出-出-入-出


例题3:证明入栈序列1-2-……-n,得到出栈序列A1-A2-A3-……An(是1、2…n的一种排列)的充要条件是:不存在i<j<k并且Aj<Ak<Ai。

(求证的充要条件的大意:在出栈序列中,若某后入栈的序列先出栈,不可能有比其先入栈的元素在该元素序列出栈后按入栈顺序出栈

如在入栈序列1-2-3-4-5之中,不可能存在5-1-3这样的出栈子序列)


分析:

充分性:若该序列为出栈序列,则满足后入先出原则。在题设当中,我们可知道元素Ak比Aj后入栈,比Ai先入栈的情况并不符合后入先出的原罪。

(必要性反之亦然,该题目的关键在于指出出栈序列的中间元素比先出元素先入栈与比后出元素先入栈的矛盾)


因为该结与序列的出入栈关系互为充要条件,所以该结论可以作为判断出栈顺序合法性的主要依据,


那么,在已知入栈的元素数量为n的情况下要如何计算出栈的序列的种数呢


二、证明出栈序列的数量:


首先我们知道,栈的性质就是先进后出,假设有入栈序列A如下

a1,a2,…ap-1,ap,ap+1,ap+2……an

根据先入后出的原则我们知道其出栈序列如下

{由an+1....an所构成的满足出栈序列的要求的组合}an{由a1…an-1s所构成的满足出栈序列要求的组合}

如此一来,假设求一个指定长度的序列的出栈序列的数量的函数为 :

int CountPopStackSequence(int lengthOfSequence);简称C(n);

则我们可以知道其递归定义如下

C(n)=C(n-p)*C(p-1); (满足乘法原理)

而我们将所有p处于1,2,3……n位置的情况相加则可以得到出栈数量的总和

C(n-1)C(0)+C(n-2)C(1)+……C(0)C(n-1)

在这里我们知道当p为首个出栈元素时,其实就是等于求长度为n-1的序列的出栈数量,所以C(n-1)C(0)=C(n-1)
即C(0)=1,同样易得C(1)=1;
满足卡特兰数的定义。


背景知识:卡塔兰数(以下来自百度百科)

         递推式

h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)
例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2
h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5
另类递推式[2] :
h(n)=h(n-1)*(4*n-2)/(n+1);
递推关系的解为:
h(n)=C(2n,n)/(n+1) (n=0,1,2,...)
递推关系的另类解为:
h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,...)



若有新的问题将会补充,未完待续……

……………………………………………………我是分割线…………………………………………………………………………………………………………………………


本博客的用途为个人学习复习所用。

便于整理和回顾自己已经学习到的某些知识的细节

所研究问题涉及计算机的方方方面面。

首先从计算机学科的基础的数据结构开始。

望该博客能够发挥其作用。



0 0
原创粉丝点击