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

参考《大话数据结构》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 }

运行结果:

转载于:https://www.cnblogs.com/hslzju/p/5405824.html

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值