入栈出栈规律·

Posted 小熊vip

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了入栈出栈规律·相关的知识,希望对你有一定的参考价值。

相信大家都做过类似这样的题目:
已知入栈序列为:1 2 3 4 5,这5个数依次入栈,出栈顺序、时机任意。
则下列可能的出栈序列不正确的是()
A 1 2 3 4 5
B 3 2 1 5 4
C 1 5 4 3 2
D 4 3 5 1 2

这种题目,相信给你一分钟心算一下就可以出来了。然而,当规模增加到10个数,20个数,估计你花费的时间会成指数增长。但是我现在想在10秒之内做出来,不管是5个数还是10个数,或者20个数。那么怎么办呢?

好吧,废话不多说,我其实就是分享做这类题目的技巧和规律。。。。。。

规律如下:
*已知栈的输入序列是1,2,3,…,n,输出序列是a1,a2,…ai,…,an。
然后我们任选一个数ai,并筛选ai到an之间所有<=ai的元素,则它们一定是按照从大到小的顺序排列的。*
(“从大到小“不一定紧紧相邻,只代表相对位置关系,比如(…,10,…,7,…,3,…,1,…)
举例:
入栈顺序:1 2 3 4 5 【n=5】
出栈顺序:3 2 1 5 4
验证:
让i=1,那么ai=3,后面小于3的有2,1。刚好3,2,1是按照从大到小的顺序排列的
让i=2,那么ai=2,后面小于2的有1。刚好2,1是按照从大到小的顺序排列的
让i=3,那么ai=1,后面小于1的有NULL,满足。
让i=4,那么ai=5,后面小于5的有4。刚好5,4是按照从大到小的顺序排列的
让i=5,那么ai=4,后面小于4的有NULL,满足。

讲一讲原理:
最理想的情况下,从小到大入栈,从大到小出栈,但是因为出栈是随机的,也就是在入栈还没结束的情况下就可以出栈。这样,就会出现一些小的数提前出栈的现象。但是那些“守规矩”的小数相对位置是没有变化的。比如入栈12345,结果在4入栈之前3不听话先出去了。但是这不会影响12的顺序,12的相对顺序还是保持着 12入栈,21出栈。因为12是守规矩的。

结束语:
当然实际做题的时候规律掌握了扫一眼就可以判断那些是错误的了。
【注;这些规律一般用来排除不满足的选项,因为这个不是充分条件】

可能会有这样的疑问:上面的规律前提都是输入序列为:1,2,3,…n这种递增的形式的,
如果哪天入栈序列改了,变成:n,n-1,…3,2,1,那规律难道都不适用了?还有就是输入的序列不是这些简单的数字,而是一些字母,数字等的混合形式,难道我又只能呵呵了。
解决方法:
一句话:你先给它们每个元素(不管是数字还是字符串)标个序号,后面直接对序号操作就OK了【按照1,2,3,…,n的顺序】。

以上是关于入栈出栈规律·的主要内容,如果未能解决你的问题,请参考以下文章

关于汇编语言问题,入栈出栈啥用

JAVA 方法的入栈出栈问题

Python模拟入栈出栈操作

一般程序的执行上下文栈之入栈出栈

Python语言实现对入栈出栈操作

n个数,入栈出栈,所有情况