知识大全 出栈序列的研究[7]

Posted 序列

篇首语:时间仿似一条直线,没有起点,亦无终点。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 出栈序列的研究[7]相关的知识,希望对你有一定的参考价值。

判断一个序列是否为出栈序列

随着n的变大 出栈序列总数越来越多 由文献[ ][ ]可知 出栈序列的求解问题是一个NP问题 所以判断一个序列是否为一个出栈序列更为重要 在文献[ ]的传统算法中 根据栈的定理[ ]判断某一序列是否为出栈序列 该定理是 对于集合N= … n 如果依次序 … n入栈 设ala a …an … n的一个全排列 则ala a …an为出栈序列的充要条件是 对于任意的ai 在它后面的且比它小的数是降序排列的 由该定理推出结论 pqr是入栈序列中的数 且p<q < r 则出序序列中pqr的排列次序不可能是rpq 

由上述推论可设计出判断某个序列是否为合法的出栈序列 该算法的源代码如下  

flag=l; // 没标志为l 假设序列a为合法的出栈序列

for(u= ;u<=n ;u++) 

for(v=u+ ;v<=n ;v++) 

for(w=v+l;w<=n;w++) 

if((a[v]<a[w])&&(a[w]<a[u]))flag= ; //若出栈次序为rpq则为不合法的出栈序列

该算法的时间复杂度为O(n ) 算法采用了该方法判断某一序列是否为出栈序列 其效率太低 为此文中借助于栈实现复杂度为O(n)的算法 其基本思想描述如下  

( ) 初始化栈stack 设置flag 

( ) v=w= v指要判断的序列 w指入栈的序列  

( ) 如果v > nflag= 则转( ) 

( ) 如果栈stack是空栈 则将第w个入栈序列符号人栈 w++ 

( ) 如果stack栈顶元素值等于序列的第v个元素 或者w ≤ n 则转( ) 

( ) w个入栈元素压入stack栈中 w ++( ) 

( ) 如果stack栈顶元素值等于序列的第v个元素 则匹配 stack栈顶元素出栈 v++ 否则 说明所判断的序列不是出栈序列 赋flag为零  

( ) ( ) 

( ) 结束 若此时flag 则序列为出栈序列 否则不是  

将该算法替代算法中的相应部分 称为改进后的算法 从表可以看出改进后的算法 在运行时间上比原算法大大缩短 甚至比算法还要好

cha138/Article/program/sjjg/201311/22742

相关参考