Home > OI > 栈都做了些什么?

栈都做了些什么?


当一个数列经过一个栈的时候,经由它独特的入栈和出栈操作,这个数列会发生些什么?抛开具体的数值,对于一数列1, 2, 3, … , n, 将它以不同的方式,经过完整的入栈和出栈操作,可以得到哪些数列?

我们来考察一个较为简单的序列1, 2, 3, 4, 5

以及两个待考察的结果:

1, 2, 4, 5, 3

1, 2, 5, 3, 4

很明显,第一个序列是可得到的。我们依次将1入栈,1出栈,2入栈,2出栈, 3, 4入栈,4出栈, 5入栈, 5出栈就可得到该数列。

然而,第二个是不可能的。前两个元素都没有问题。为了第三个弹出5,我们需要先将3,4入栈,此时下一个出栈的只能是4,而该数列中却弹出了3,故不可能。

那么,一般地,如何判断一个数列是否是满足条件的呢?

可以观察到,每一个数列可以划分为若干段单调递增的子数列,比如第一个:1245|3,第二个:125|34

事实上,一个数列满足条件,当且仅当在它每两段单调递增的子数列的交界处,满足后一个数列的第一个数是之前没有出现过的数中最大的

证明也并不困难,事实上,同时在这个栈中的元素一定满足从栈底到栈顶单调递增,那么在这个交界处(也就是开始往外弹积存已久的数了)必定先弹出栈顶较大的元素;另一方面,我们也很容易根据单调递增子数列的分段方法,构造出一种具体的入栈出栈次序。

这样,我们就可以很快知道,下面几个数列都不能由1, 2, 3, …, 9经栈操作得到

1, 3, 2, 5, 4, 8, 6, 7, 9 –> 13|25|48|679

3, 2, 1, 5, 7, 4, 6, 8, 9 –> 3|2|157|4689

Categories: OI Tags: , , ,
  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: