码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-04-18 22:20:31      阅读:1132      评论:0      收藏:0      [点我收藏+]

标签:

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

运行结果:

技术分享

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

标签:

原文地址:http://www.cnblogs.com/hslzju/p/5405824.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!