两个栈共享一块存储空间新解

前段时间数据结构的作业里有一个这样的题跟大家分享一下:

若栈采用顺序存储方式存储,现两栈共享空间V[1..m], top[i]代表第i个栈( i =1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是( )。

A. |top[2]-top[1]|=0      B. top[1]+1=top[2]

C. top[1]+top[2]=m      D. top[1]=top[2]

本来这是一个很简单的问题,想必大家一眼就能得出答案是B,但我当时不知道是那根筋抽搐,自己跟自己较劲,牛角尖钻的无厘头,最后是怎么也想不通了。那下边我就把自己一开始的想法说一下,还望各位大牛勿喷~~

这是两个栈共享一块存储空间的实例。关于栈的初始化可谓是各有各的小算盘,栈顶指针有的初始化为0,有的初始化为1,还有的初始化为-1,不管你们怎么想,反正我是蒙了。先不管它,按照C语言的规则,咱们还是把栈顶指针初始化为0,这样便于计算。那首先大家想象一下有这么一块内存,大小为50,由于栈限定只能在栈顶进行操作,那么我们就把这块内存空间的顶端和低端分别作为2栈和1栈的栈底,当入栈时相当于两列火车相向而行,等待着相撞的那一瞬间,只要不撞车就继续前行,这样就降低了上溢发生的机率,节省了内存空间。

于是乎问题来喽,什么时候算是满栈,有人说了不就是等到两个栈相遇的时候嘛,那怎么判定两个栈相遇呢?又有人说了等到栈顶指针相遇时不就是栈满了嘛,yes,关键就是这里,我当初也就是纠结这两个栈顶指针。脑子里出现了很多画面,两个栈顶指针top1和top2从两端出发,期待着能与彼此相遇,走啊走走啊走,终于等到了相见的那一天。由于栈顶指针总是位于栈顶元素的下一个位置,所以当top1和top2相遇时,即top1+1=top2,两个栈满员,经过了多少风风雨雨,有情人终成眷属,祝福他们吧。但我此时可没心情去给他们撒花鼓掌,脑子里神经质地蹦出来很多东西,我又开始乱想啦,当两个栈顶指针相遇时,它们所指的是两个空的存储单元,那这不就浪费了嘛,习主席号召我们要厉行勤俭节约,反对铺张浪费,所以我就想能不能把这两个栈顶指针所指的空间填满,这不就完美了么,于是乎问题又来了,如果是1栈先加入元素,那么top1不就与top2重合了嘛,反之一样,最理想的就是两个栈同时入栈元素,但想到这里已经知道自己错了,不可能会出现歧义,其实更为神奇的是我居然想到当两个栈顶指针重合时再入栈元素的话,那么top1不就越过top2了嘛,于是就有了top2+1=top1,哎,各种版本都有啊,我是彻底无力了。

为此在网上搜集了各种相关资料,真是众说纷纭啊,也是充斥着各种版本,不过最后答案一致指向B,还是top1+1=top2。最后求救于老师,老师的看法是当两个栈顶指针相遇时就算是栈满,至于那两小块空出来的内存空间就当是标记,就像循环队列一样,最后也是留出两个小空间用于说明头指针和尾指针,就是这么个情况。

可能到最后大家也没有听懂我在说什么,其实我也一直处于一种游离状态,还不是那么确定,所以还请各位大牛予以指点,在此谢过了。

通过这个例子又想起了那个最传统的问题,关于常规的入栈,当top=Maxsize-1即栈顶指针到达真正的栈顶时,如果再入栈元素,那么栈顶指针是指向Maxsize还是保持不动。假如是前者的话,那么top将指向一个未知的空间;如果是后者的话又不符合栈的入栈规则,但也不排斥有这种特殊规定。反正这两者都不是一个满意的答复,在下将继续探索,相信总会等到拨云雾见蓝天的那一瞬间。

两个栈共享一块存储空间新解

时间: 2024-10-13 16:14:23

两个栈共享一块存储空间新解的相关文章

两个堆栈共用一块新的存储空间溶液

就业数据结构前一段时间,有一个问题,与大家分享: 用顺序存储方式存储,现两栈共享空间V[1..m], top[i]代表第i个栈( i =1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是( ). A. |top[2]-top[1]|=0      B. top[1]+1=top[2] C. top[1]+top[2]=m      D. top[1]=top[2] 本来这是一个非常easy的问题,想必大家一眼就能得出答案是B,但我当时不知道是那根筋抽搐,自己跟自己较劲,牛角尖钻

两栈共享存储空间

两栈共享空间就是指,当其中一个栈的空间用光时,可以借用另外一个栈的空间,这样就大大提高了空间的利用率. 一个数组有两个端点,一个起始端点,另一个是数组末尾.而两个栈有两个栈底,我们就将其中一个栈底作为数组的起始端点,另一个栈底作为数组的末端.两个栈如果增加元素,就向中间延伸. 那么,我们该如何操作这个共享空间的栈呢?其中一个栈的top指针指向数组0处,另一个栈的top指针指向数组(n-1)处,n为数组长度.当top1 = -1, top2 = n时,意味着栈1和栈2都为空栈.当有数据存放在栈1中

两栈共享空间的存储结构和入栈出栈操作

参考<大话数据结构>P95~96——两栈共享存储空间. 当两个栈的需求空间有相反关系时,也就是一个栈增长时,另一个栈在缩短,可以采用两栈共享空间结构.这是针对两个具有相同数据类型的栈的一个设计技巧. 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 #define MAXSIZE 6 //本例中栈满共6个元素 6 typed

两栈共享空间

1 思路 如果有两个类型相同的栈,我们为它们分别开辟了数组空间.极有可能是一个栈已经满了,再入栈就溢出了,而另一个栈却还有很多存储空间.这又何必呢?我们完全可以用一个数组来存储两个栈,只不过需要一些小的技巧. 我们的做法如下,数组有两个端点,两个栈有两个栈底.让一个栈的栈底为数组的始端,即数组下标为0的位置.让另一个栈的栈底为数组的末端,即数组下标为n-1的位置.这样如果两个栈增加元素,就是两端点向中间延伸. 其实关键思路是:它们是在数组的两端,向中间靠拢.top1和top2是两个栈的栈顶指针.

02两栈共享空间_DoubleStack--(栈与队列)

#include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 /* 存储空间初始分配量 */ typedef int Status;

顺序栈的实现和两栈共享空间

顺序栈的实现和两栈共享空间 一.顺序栈的实现 栈(stack)是限定仅在表尾进行插入或删除操作的线性表.我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何 数据元素的栈称为空栈.栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构. 理解栈的定义需要注意: 首先他是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关系.只不过他是一种特殊的线性表而已.定义中说是在线性表的表尾进行插入和删除操作,这里表尾是指栈顶,而不是栈底. 他的

数据结构(七)两栈共享空间

一.栈的顺序存储的一个很大的缺陷就是必须事先确定数组存储空间大小,万一不够用了,就要用编程手段来扩展数组的容量,非常麻烦. 二.对于一个栈,也只能尽量考虑周全,设计出合适大小的数组来处理:但是对于两个相同类型的栈,可以做到最大限度地利用其事先开辟的存储空间来进行操作. 三.如果有两个相同类型的栈,为它们各自开辟了数组空间,极有可能是第一个栈已经满了,再进栈就溢出了,而另外一个栈还有很多存储空间.所以两栈共享空间的思想是:让一个栈的栈底为数组的开始端,即下标为0处,另一个栈的栈底为数组的末端,即下

两栈共享问题

这个应该是以一个数组实现两个栈的共享. ----------------------------------------------- | | | | | | | | | | | 长度为10的数组 ------------------------------------------------top1(-1) top2(10)如上图,假设初始top1为-1,top2为10,栈1push了一个数字2,栈2push了一个数字3之后,数组变成如下形式,top1为0,top2为9: ----------

数据结构:两栈共享空间

两栈共享空间方法: 数组有两个端点,两个栈有两个栈底,让一个栈的栈底为数组的始端,即下标为0处,另一个的栈底为数组的末端,即下标为n-1处.这样,如果两个栈增加元素,就是两端点向中间延伸.当top1 + 1 == top2 的时候为栈满. 但是这只是针对两个具有相同数据类型的栈的一个设计上的技巧,这种数据结构适合一个栈增长一个栈同时在缩短的情况,就像有卖的同时一定有买,有输的同时一定有赢,适合一种零和博弈. 两栈共享空间的代码实现: #include <iostream> #include &