知识大全 出栈序列的研究[7]
Posted 序列
篇首语:时间仿似一条直线,没有起点,亦无终点。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 出栈序列的研究[7]相关的知识,希望对你有一定的参考价值。
判断一个序列是否为出栈序列
随着n的变大 出栈序列总数越来越多 由文献[ ]和[ ]可知 出栈序列的求解问题是一个NP问题 所以判断一个序列是否为一个出栈序列更为重要 在文献[ ]的传统算法中 根据栈的定理[ ]判断某一序列是否为出栈序列 该定理是 对于集合N= … n 如果依次序 … n入栈 设ala
由上述推论可设计出判断某个序列是否为合法的出栈序列 该算法的源代码如下
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 > n或flag= 则转( )
( ) 如果栈stack是空栈 则将第w个入栈序列符号人栈 w++
( ) 如果stack栈顶元素值等于序列的第v个元素 或者w ≤ n 则转( )
( ) 第w个入栈元素压入stack栈中 w ++ 转( )
( ) 如果stack栈顶元素值等于序列的第v个元素 则匹配 stack栈顶元素出栈 v++ 否则 说明所判断的序列不是出栈序列 赋flag为零
( ) 转( )
( ) 结束 若此时flag为 则序列为出栈序列 否则不是
将该算法替代算法中的相应部分 称为改进后的算法 从表可以看出改进后的算法 在运行时间上比原算法大大缩短 甚至比算法还要好
cha138/Article/program/sjjg/201311/22742相关参考