共享栈

  • 共享栈示意图
  • 1.头文件及类型定义
  • 2.共享栈类型定义
  • 3.函数声明
  • 4.基本操作
    • 4.1 初始化共享栈
    • 4.2 1号栈判空
    • 4.3 2号栈判空
    • 4.4 1号栈入栈
    • 4.5 2号栈入栈
    • 4.6 1号栈出栈
    • 4.7 2号栈出栈
    • 4.8 1号栈读取栈顶元素
    • 4.9 2号栈读取栈顶元素
    • 4.10 main函数
  • 5.小结

共享栈示意图

1.头文件及类型定义

#include<stdio.h>
#define MaxSize 10              //定义共享栈中元素的最大个数
#define ElemType int

2.共享栈类型定义

typedef struct {ElemType data[MaxSize];      //静态数组存放栈中元素int top1;                   //1号栈栈顶指针int top2;                  //2号栈栈顶指针
}ShStack;

3.函数声明

/*函数声明*/
void InitShStack(ShStack& S);               //1.初始化共享栈
bool Stack1Empty(ShStack S);                //2. 1号栈判空
bool Stack2Empty(ShStack S);                //2. 2号栈判空
bool Push1(ShStack& S, ElemType x);         //3. 1号栈入栈
bool Push2(ShStack& S, ElemType x);         //4. 2号栈入栈
bool Pop1(ShStack& S, ElemType& x);         //5. 1号栈出栈
bool Pop2(ShStack& S, ElemType& x);         //6. 2号栈出栈
bool GetTop1(ShStack S, ElemType& x);       //7. 1号栈读取栈顶元素
bool GetTop2(ShStack S, ElemType& x);       //8. 2号栈读取栈顶元素

4.基本操作

4.1 初始化共享栈

//1.初始化共享栈
void InitShStack(ShStack& S) {S.top1 = -1;     //初始化1号栈栈顶指针S.top2 = MaxSize;  //初始化2号栈栈顶指针
}

4.2 1号栈判空

//2. 1号栈判空
bool Stack1Empty(ShStack S) {return (S.top1 == -1);
}

4.3 2号栈判空

//2. 2号栈判空
bool Stack2Empty(ShStack S) {return (S.top2 == MaxSize);
}

4.4 1号栈入栈

//4. 1号栈入栈操作:新元素入栈(先存再加)
bool Push1(ShStack& S, ElemType x) {if (S.top1+1 == S.top2)      //栈满,报错return false;S.data[++S.top1] = x;return true;
}

4.5 2号栈入栈

//5. 2号栈入栈操作:新元素入栈(先存再加)
bool Push2(ShStack& S, ElemType x) {if (S.top1 + 1 == S.top2)        //栈满,报错return false;S.data[--S.top2] = x;return true;
}

4.6 1号栈出栈

//6. 1号栈出栈操作:栈顶元素出栈
bool Pop1(ShStack& S, ElemType& x) {if (S.top1 == -1) //1号栈栈空,报错return false;x = S.data[S.top1--];    return true;
}

4.7 2号栈出栈

//7. 2号栈出栈操作:栈顶元素出栈
bool Pop2(ShStack& S, ElemType& x) {if (S.top2 == MaxSize)    //2号栈栈空,报错return false;  x = S.data[S.top2++];return true;
}

4.8 1号栈读取栈顶元素

//8. 1号栈读取栈顶元素操作
bool GetTop1(ShStack S, ElemType& x) {if (S.top1 == -1)   //1号栈栈空,报错return false;x = S.data[S.top1];return true;
}

4.9 2号栈读取栈顶元素

//9. 2号栈读取栈顶元素操作
bool GetTop2(ShStack S, ElemType& x) {if (S.top2 == MaxSize)  //2号栈栈空,报错return false;x = S.data[S.top2];return true;
}

4.10 main函数

int main() {ShStack S;       //声明一个共享栈(分配内存空间)/*1、初始化共享栈*/InitShStack(S);/*2、1号栈-判空*/if (Stack1Empty(S))printf("当前1号栈空!\n");elseprintf("当前1号栈非空!\n");/*3、1号栈-入栈操作*/ElemType e1;printf("请输入1号栈入栈元素的值:");scanf("%d", &e1);if (Push1(S, e1))printf("1号栈新元素入栈成功!\n");elseprintf("共享栈已满,1号栈新元素入栈失败!\n");/*4、1号栈-读取栈顶元素*/ElemType e2 = -1;if (GetTop1(S, e2))printf("1号栈读取栈顶元素成功,当前栈顶元素值为:%d\n", e2);elseprintf("1号栈已空,读取栈顶元素失败!\n");/*5、1号栈-出栈操作*/ElemType e3 = -1;if (Pop1(S, e3))printf("1号栈栈顶元素出栈成功,出栈元素值为:%d\n", e3);elseprintf("1号栈已空,栈顶元素出栈失败!\n");/*6、1号栈-读取栈顶元素*/ElemType e4 = -1;if (GetTop1(S, e4))printf("1号栈读取栈顶元素成功,当前栈顶元素值为:%d\n", e4);elseprintf("1号栈已空,读取栈顶元素失败!\n");/*7、2号栈-判空*/if (Stack2Empty(S))printf("当前2号栈空!\n");elseprintf("当前2号栈非空!\n");/*8、2号栈-入栈操作*/ElemType e21;printf("请输入2号栈入栈元素的值:");scanf("%d", &e21);if (Push2(S, e21))printf("2号栈新元素入栈成功!\n");elseprintf("共享栈已满,2号栈新元素入栈失败!\n");/*9、2号栈-读取栈顶元素*/ElemType e22 = -1;if (GetTop2(S, e22))printf("2号栈读取栈顶元素成功,当前栈顶元素值为:%d\n", e22);elseprintf("2号栈已空,读取栈顶元素失败!\n");/*10、2号栈-出栈操作*/ElemType e23 = -1;if (Pop2(S, e23))printf("2号栈栈顶元素出栈成功,出栈元素值为:%d\n", e23);elseprintf("2号栈已空,栈顶元素出栈失败!\n");/*11、2号栈-读取栈顶元素*/ElemType e24 = -1;if (GetTop2(S, e24))printf("2号栈读取栈顶元素成功,当前栈顶元素值为:%d\n", e24);elseprintf("2号栈已空,读取栈顶元素失败!\n");return 0;
}

5.小结

  1. 共享栈的定义
    共享栈是逻辑上实现了两个栈,但物理上这两个栈共享同一片内存空间。因此在进行判空操作时,两个栈分别进行判断,但在判满时要判断整个共享栈的存储情况。
  2. 说明
    共享栈的实现与顺序栈的实现大同小异,它们都属于栈的顺序存储,只需要注意在栈顶指针处别犯错就可以。

【数据结构】-共享栈相关推荐

  1. 【数据结构】栈-顺序栈、链式栈、共享栈

    栈的定义 栈(Stack):只允许在一端进行插入或删除操作的线性表 栈顶(Top):线性表允许进行插入和删除的那一端. 栈底(Bottom):固定的,不允许进行插入和删除的另一端. Tips: 1.栈 ...

  2. 【数据结构与算法】共享栈的Java实现

    共享栈 在一个程序中如果同时具有相同类型的两个顺序栈,最直接的方法是为每个栈开辟一个一个数组空间,这样做的结果可能出现一个栈的空间已经被占满而无法再进行操作而另一个栈的空间仍有大量剩余而没有得到利用的 ...

  3. 大话数据结构08:共享栈 C++

    基础介绍 共享栈就是一块内存分配给两个栈,两个栈从各自端点向中间生长,就是计算机基础中内存栈的实现吧 代码 #include "stdio.h" #define OK 1 #def ...

  4. 数据结构之 顺序栈、共享栈、链栈

    顺序栈.共享栈.链栈 一.思维导图: 二.栈的定义: 三.栈的特点: 四.栈的基本操作: 五.常考题型: 六.顺序栈: 1.思维导图: 2.顺序栈基本操作的实现: 1.定义栈: 2. 初始化栈:Ini ...

  5. 数据结构 3-1-2 共享栈

    一.概念 共享栈是为了优化一般栈的空间利用而提出的优化,在线性栈的两端设置两个栈,共用整个空间,即在一个数组空间中实现了两个栈.可能在实际中并不会用到,但是在题目考察中还是会出现的. 共享栈是为了更有 ...

  6. 数据结构(共享栈的实现)

    1.定义 共享栈:两个栈共享同一片内存空间,两个栈从两边往中间增长. 目的:节省内存空间. 空栈判断:一号栈的栈顶指针为-1,二号栈的栈顶指针为MaxSize. 栈满判断:一号栈的栈顶指针位置等于二号 ...

  7. 【数据结构】共享栈详解 判断共享栈满条件栈顶指针变化详解记忆方法例题

    摘要:简单易懂,详细地介绍共享栈概念,指针,判断共享栈栈满条件以及记忆方法等 目录 共享栈概念 栈顶指针&变化详解 栈顶指针种类的记忆方法 判断栈满条件 判断栈满条件的记忆方法 例题 解题思路 ...

  8. 内存、数据结构之栈和堆的区别?

    网上有一篇很好的文章,我差不多直接搬运过来了. 来源:http://www.cleey.com/blog/single/id/776.html 原文如下: 可能很多同学在这个概念上有些模糊,其实堆栈分 ...

  9. 数据结构 3-0 栈与队列总结

    总结 栈和队列都可以看作对输入输出做限制的线性表.其中栈是限制了输入和输出只能在一端进行的线性表,可以将其看作向箱子里面摞书,想要取出最下面的书必须要先拿出上面的书,对应栈先进后出的特点.而队列正如其 ...

最新文章

  1. excel甘特图模板_类似这样的甘特图是怎么做的?
  2. 收藏 | 因果推断书籍代码合集
  3. python读写excel(合并单元格)
  4. 超全的Go Http路由框架性能比较
  5. 用DateTime.ToString(string format)输出不同格式的日期
  6. python中os.system.获取输出信息_python中os.system()的返回值
  7. C++ 对引用的理解4
  8. 【单片机实验】矩阵键盘
  9. DotText源码学习——从配置文件Web.config入手(一)
  10. Rabbit MQ 配置
  11. Fedora32升级Fedora33后无线网络无法连接的问题
  12. spring 注解重复(防重复请求)
  13. 有了漏洞扫描器,如何用好?一点不成熟的小总结
  14. 数据安全对企业的重要性
  15. 输出 系统 环境变量
  16. HDU 4371 Alice and Bob
  17. Monkey测试:日志信息分析
  18. 剑指 Offer 07. 重建二叉树(day02)
  19. Android Editable
  20. 信息系统监理师考试知识点整理

热门文章

  1. 用拉普拉斯变换求零状态响应_高斯拉普拉斯算子(Laplacian of Gaussian, LoG)
  2. 02-python 爬虫中国诗词网的诗词标题和内容
  3. focus-within switch tab
  4. 频谱的故事:从模拟信号到3G再到如今的5G网络
  5. Android 单元测试-运行
  6. php微信小程序向下滑动,详解微信小程序组件:slider滑动选择器
  7. 七、springboot 单元测试阶段 (2、JUnit5常用注解,3、断言(assertions) )
  8. 排序算法 | sort函数的使用
  9. 怎么用计算机弄出饺子,如何用英文写包饺子的步骤?
  10. 《炬丰科技-半导体工艺》光刻胶中金属杂质对硅基基质的吸附机理