共享栈和双端队列

时间:2024-03-14 16:40:53

共享栈和双端队列

一、共享栈

相比于普通的顺序栈,共享栈主要是为了提高内存的利用率和减少溢出的可能性而设计的。
为了增加内存空间的利用率和减少溢出的可能性,当两个栈共享一篇连续的内存空间时,应将两栈的栈底分别设在这片内存空间的两端,这样当两个栈的栈顶在栈空间的某一位置相遇时,才产生上溢。

二、双端队列

双端队列是一种插入和删除操作在两端均可进行的线性表,可以把双端队列看成栈底连在一起的两个栈。他们与两个栈共享存储空间的共享栈的不同指出是,两个栈的栈顶指针式向两端延伸的。由于双端队列允许在两端插入和删除元素,因此需要设立两个指针,分别指向双端队列中两端的元素。
允许在一端进行插入和删除(进队和出队),另一端只允许删除的双端队列称为输入受限的双端队列。
允许在一端进行插入和删除,另一端只允许插入的双端队列称为输出受限的双端队列

例1.设有一 个双端队列,元素进入该队列的顺序是1, 2, 3, 4.试分别求出满足下列条件的
输出序列。
(1)能由输入受限的双端队列得到,但不能由输出受限的双端队列得到的输出序列。
(2)能由输出受限的双端队列得到,但不能由输入受限的双端队列得到的输出序列。
(3)既不能由输入受限的双端队列得到,也不能由输出受限的双端队列得到的输出序列。
共享栈和双端队列
解答
(1)先看输入受限的双端队列,假设end1端输入1,2,3,4,那么end2端的输出相当于队列的输出;1,2,3,4;而end1端的输出相当于栈的输出,n=4时,可以通过Catalan()仅通过end1端有14中输出序列,仅仅通过end1端不能得到的输出序列有4!-14=10种,它们是:

1,4,2,3 2,4,1,3
3,4,1,2 3,1,4,2
3,1,2,4 4,3,1,2
4,2,1,3 4,1,2,3
4,1,3,2 4,2,1,3

通过end1和end2端混合输出,可以输出着10种中的8种。其中,SL,XL分别代表end1端的进队和出队,XR代表end2端的出队
通过end1和end2端的混合输出序列图如下
共享栈和双端队列
可以得出有两种是不可能通过受限的双端队列输出的,即4,2,1,3和4,2,3,1
(2)假设end1端和end2端输入,还可以输出其中8种,假设SL代表end1端的输入,SR,XR代表end2端的输入和输出,则可能输出序列以及进队和出队序列如下图所示。
共享栈和双端队列
可得通过输出受限的双端队列不能输出的两种序列是:4,1,3,2和4,2,3,1
(3)取如上(1)和(2)的交集可得既不能由输入受限的双端队列得到 ,也不能由输出受限的双端队列得到的输出序列是4,2,3,1

综上得:
能由输入受限的双端队列得到,但不能由输出受限的双端队列得到的输出序列是4,1,3,2;能由输出受限的双端队列得到,但不能由输入受限的双端队列得到的输出序列是4,2,1,3;
既不能由输入受限的双端队列得到,也不能由输出受限的双端队列得到的输出序列是4,2,3,
1。

相关文章