出栈序列的可能性判定问题(PAT1051)

问题说明

PAT1051:给定stack的容量,给定数据的入栈顺序:从1开始的正整数序列,在允许随机的出栈操作的情况下,要求判断某出栈序列是否可能。

比如,告知stack容量为5,入栈序列的最大值为7。有两个序列需要判断合理性:

  • 1 2 3 4 5 6 7: 这个序列是可能的,只需每次入栈时都做出栈操作。
  • 3 2 1 7 5 6 4: 这个序列是不可能的,其中前半部分3 2 1是合法的,先将1 2 3顺序入栈,然后三次执行出栈操作。而之后的7 5 6则是不可能的。

要完成判定过程,常规思路是直接使用的stack数据结构模拟出栈序列做操作,然后判定是否会触犯条件。但考虑到PAT1051中时间限制只有10ms,虽然常规方法是线性的,似乎也无法保障(事实证明是错误的,用常规方法也能在PAT上AC),我想到从序列本身的特性入手,找规律,于是有了一种效率更高的判定逻辑。

常规思路

直接使用出栈序列指导stack模拟操作。判定条件有两条:

  • 1.栈中数据量不超过栈的容量。
  • 2.出栈只能从栈顶取,不应该出现从固定的堆栈中取出其他数据的情况。

算法描述如下:

用游标记录当前已知压栈的最大数据cur。如果新的读入数据tmp(即出栈序列中的某数据)大于cur,则将cur到tmp之间的数据顺序压入栈中,更新cur并执行检查1;如果新的读入数据tmp小于cur,则一定是直接出栈获得的,执行检查2。

如果能顺利完成就是合理的,如果操作过程违背了一些规则,则判定为不合理。C++

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值