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

参考《大话数据结构》P95~96——两栈共享存储空间。

当两个栈的需求空间有相反关系时,也就是一个栈增长时,另一个栈在缩短,可以采用两栈共享空间结构。这是针对两个具有相同数据类型的栈的一个设计技巧。

举个简单的例子:

代码和解释如下(VS2012测试通过):

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4
 5 #define MAXSIZE 6 //本例中栈满共6个元素
 6 typedef string status;//本例尝试用书上推荐的status返回是否成功,C++中的模板类string比字符数组char[]更方便
 7
 8 //两栈共享空间的存储结构
 9 typedef struct
10 {
11     char data[MAXSIZE];
12     int top1;//栈1的栈顶所在元素的数组下标
13     int top2;//栈2的栈顶所在元素的数组下标
14 }SqDoubleStack;
15
16 //两栈共享空间的初始化,申请内存,把栈初始化为空栈
17 //返回指向SqDoubleStack结构的地址
18 SqDoubleStack *InitSqDoubleStack(SqDoubleStack *s)
19 {
20     s=new SqDoubleStack;
21     s->top1=-1;
22     s->top2=MAXSIZE;
23     return s;
24 }
25
26 //入栈
27 //插入元素e为新的栈顶元素,stacknumber是栈号参数
28 //因为在开始判断了是否栈满,后面的top1+1和top2-1是不担心溢出问题的
29 status Push(SqDoubleStack *s,char e,int stacknumber)
30 {
31     if(s->top1+1==s->top2)//若栈已满,不能插入新的元素
32         return "error";
33     if(stacknumber==1)//栈1有元素进栈
34         s->data[++s->top1]=e;//先top1加1,再给数组元素赋值
35     else if(stacknumber==2)//栈2有元素进栈
36         s->data[--s->top2]=e;//先top2减1,再给数组元素赋值
37     return "push ok";//元素入栈成功
38 }
39
40 //出栈
41 status Pop(SqDoubleStack *s,char *e,int stacknumber)
42 {
43     if(stacknumber==1)
44     {
45         if(s->top1==-1)//若栈1已空,没有元素出栈
46             return "error";
47         *e=s->data[s->top1--];//将栈1的栈顶元素先出栈,再top1减1
48     }
49     else if(stacknumber==2)
50     {
51         if(s->top2==MAXSIZE)//若栈2已空,没有元素出栈
52             return "error";
53         *e=s->data[s->top2++];//将栈1的栈顶元素出栈,再top2加1
54     }
55     return "pop ok";//元素出栈成功
56 }
57
58 int main()
59 {
60     SqDoubleStack *p=NULL;
61
62     //调用初始化函数
63     p=InitSqDoubleStack(p);
64
65     //入栈
66     cout<<"A"<<" "<<Push(p,‘A‘,1)<<" ";//进栈1,A
67     cout<<p->top1<<endl;//top1等于0
68     cout<<"a"<<" "<<Push(p,‘a‘,2)<<" ";//进栈2,a
69     cout<<p->top2<<endl;//top2等于MAXSIZE-1=5
70     cout<<"B"<<" "<<Push(p,‘B‘,1)<<" ";//进栈1,B
71     cout<<p->top1<<endl;//top1等于1
72     cout<<"b"<<" "<<Push(p,‘b‘,2)<<" ";//进栈2,b
73     cout<<p->top2<<endl;//top1等于MAXSIZE-1-1=4
74
75     //出栈
76     char e;
77     char *pe=&e;
78     cout<<Pop(p,pe,1)<<" ";
79     cout<<e<<endl;//栈1,出B
80     cout<<Pop(p,pe,2)<<" ";
81     cout<<e<<endl;//栈2,出b
82     cout<<Pop(p,pe,1)<<" ";
83     cout<<e<<endl;//栈1,出A
84     cout<<Pop(p,pe,2)<<" ";
85     cout<<e<<endl;//栈2,出a
86     cout<<Pop(p,pe,1)<<endl;//栈1已空,元素出栈失败
87     cout<<Pop(p,pe,2)<<endl;//栈2已空,元素出栈失败
88 }

运行结果:

时间: 2024-10-24 05:14:53

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

栈的链式存储结构和入栈出栈操作

参考<大话数据结构>P98~99——栈的链式存储结构. 进栈: 出栈: 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 typedef string status;//用书上推荐的status返回是否成功,C++中的模板类string比字符数组char[]更方便 6 7 //栈的结点 8 //包含data,和指向下一个结点

两栈共享空间

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

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

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

数据结构:两栈共享空间

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

两栈共享空间的c语言实现

1. 两栈共享空间结构 typedef struct { SElemType data[MAXSIZE]; int top1; /* 栈1栈顶指针 */ int top2; /* 栈2栈顶指针 */ }SqDoubleStack; 2. 构造一个空栈S Status InitStack(SqDoubleStack *S) { S->top1=-1; S->top2=MAXSIZE; return OK; } 3. 把S置为空栈 Status ClearStack(SqDoubleStack *

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

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

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). 栈也是线性结构的一种特例.与队列不同,他只有一个口,只能从这里读或者写数据,这个口称为栈顶(top).栈是一种先进后出的数据结构.先进来的元素会放入栈底,而后进来的元素被放在它的上面,最后进来的元素的上面的位置,称为栈顶. 栈所提供的操作比一般的线性表要少很多,只提供:初始化.销毁.判断是否为空.求栈的长度.清空栈.

栈的链式存储结构及应用(C、Java代码)

链式存储结构最大的好处就是没有空间的限制,可以通过指针指向将结点像以链的形式把结点链接,我们熟悉的线性表就有链式存储结构. 当然,栈同样有链式存储结构,栈的链式存储结构,简称链栈. 从图片可以看到,和单链表很像,拥有一个头指针top,又称作栈顶指针,所以此时就不再需要单链表里面的头结点了. 对于链栈来说,基本不存在栈满的情况,除非计算机内存已经没有了可使用的空间,如果真的存在,那么计算机系统已经面临着即将死机崩溃的情况,而不是这个链栈是否溢出的问题了. 对于空栈来说,链表的定义是头指针指向NUL