目录

一 、共享栈的基本概念

1.定义

2.特点

二、共享栈的表示

三、共享栈的基本操作

1.共享栈的初始化操作

2.共享栈的判空操作

3.共享栈的进栈操作

0号栈进栈

1号栈进栈

4.共享栈的出栈操作

0号栈出栈

1 号栈出栈

5.取栈顶元素

取0号栈栈顶元素

取1号栈栈顶元素


一 、共享栈的基本概念

1.定义

利用栈底位置的不变性,可让两个顺序栈共享一个一维数组,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延申。

2.特点

共享栈是为了更有效的利用存储空间,两个栈的空间相互调节,只有在整个存储空间被占满时才发生上溢。其存储数据的时间复杂度均为O(1),对存取效率没有影响。

二、共享栈的表示

typedef struct {ElemType data[MaxSize];int top0;int top1;
}ShareStack;

三、共享栈的基本操作

栈空:两个栈的栈顶指针都指向栈顶元素,top0=-1时0号栈为空,top1=MaxSize时1号栈为空;
栈满:仅当两个栈顶指针(top1-top0=1)时,判断为栈满。
进栈:当0号栈进栈时,top0先加1,再赋值;1号栈进栈时,top1先减1,再赋值。
出栈:当0号栈出栈时,先赋值,top0再减1;1号栈出栈时,先赋值,top1再加1。

1.共享栈的初始化操作

void InitShareStack(ShareStack* shstack)
{shstack->top0 = -1;       //初始化栈顶指针shstack->top1 = MaxSize;
}

2.共享栈的判空操作

int EmptySharaStack(ShareStack shstack)
{if (shstack.top0 == -1 && shstack.top1 == MaxSize)   //两个栈都空时,返回1{return 2;} else if (shstack.top0 == -1)                        //0号栈为空,1号栈非空时,返回0{return 0;}else if (shstack.top1 == MaxSize)                   //1号栈为空,0号栈非空时,返回1{return 1;}return -1;                                           //两个栈都非空时,返回-1
}

3.共享栈的进栈操作

0号栈进栈

bool PushTop0(ShareStack* shstack, ElemType e)
{if ((shstack->top1 - shstack->top0) == 1)   //栈满,报错{return false;                 }shstack->top0++;                           //0号栈顶指针先加1shstack->data[shstack->top0] = e;          //元素入栈return true;
}

1号栈进栈

bool PushTop1(ShareStack* shstack, ElemType e)
{if ((shstack->top1 - shstack->top0) == 1)   //栈满,报错{return false;}shstack->top1--;                            //1号栈顶指针先减一shstack->data[shstack->top1] = e;           //元素入栈return true;
}

4.共享栈的出栈操作

0号栈出栈

bool PopTop0(ShareStack* shstack, ElemType* e)
{if (shstack->top0 == -1)            //1号栈空,报错{return false;}*e = shstack->data[shstack->top0];  //栈顶元素先出栈shstack->top0--;                    //栈顶指针再减1return true;
}

1 号栈出栈

bool PopTop1(ShareStack* shstack, ElemType* e)
{if (shstack->top1 == MaxSize)       //1号栈空,报错{return false;}*e = shstack->data[shstack->top1];  //栈顶元素先出栈shstack->top1++;                    //栈顶指针再加1return true;
}

5.取栈顶元素

取0号栈栈顶元素

bool PopTop0(ShareStack* shstack, ElemType* e)
{if (shstack->top0 == -1)            //1号栈空,报错{return false;}*e = shstack->data[shstack->top0];  //取栈顶元素return true;
}

取1号栈栈顶元素

bool PopTop1(ShareStack* shstack, ElemType* e)
{if (shstack->top1 == MaxSize)        //1号栈空,报错{return false;}*e = shstack->data[shstack->top1];   //取栈顶元素return true;
}

Human is the animal with ideal.

The purpose of his life is to realize the ideal.

【C语言实现共享栈】关于【共享栈】,你知道多少,快来看看吧相关推荐

  1. 数据结构与算法(3-1)栈(顺序栈、两栈共享空间、链栈、栈的计算器)

    目录 一.顺序栈 存储结构 总代码 二.两栈共享空间 存储结构: 总代码: 三.链栈 存储结构: 总代码: 一.顺序栈 存储结构: 栈特点:先进后出,后进先出.(特殊的线性表) 入栈时在栈顶添加元素, ...

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

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

  3. 一个数组实现两个栈(共享栈)

    题目:   一个数组实现两个栈. 方法1:   下标为0的位置为栈1的栈底,下标为1的位置为栈2的栈底,栈1的元素存放在下标为偶数的位置上,栈2的元素放在下标为奇数的位置上.   如上图所示的数组:若 ...

  4. 【数据结构】两栈共享空间(双端栈)

    1.定义 两栈共享空间:使用一个数组来存储两个栈,让一个栈的栈底为该数组的始端,另一个栈的栈底为该数组的末端,两个栈从各自的端点向中间延伸. 栈1的底固定在下标为0的一端: 栈2的底固定在下标为Sta ...

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

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

  6. 两栈共享存储空间(线性结构栈)

    #ifndef DOUBLESTACK_H #define DOUBLESTACK_H /*(1)引入1.如果需要两个相同类型的栈(顺序结构), 分别为了两个栈开辟存储空间.极有可能出现的情况是栈1已 ...

  7. 数据结构(C语言版) 第 三 章 栈与队列 知识梳理 + 作业习题详解

    目录 一.栈 0.栈的基本概念 1.栈的实现 2.栈与递归 3.Hanoi塔问题 二.队列 0.队列的基本概念 1.队列的实现 2.循环队列 2.1循环队列的相关条件和公式: 3.链队列 4.链队列完 ...

  8. c语言出栈入栈指针的管理,设计顺序栈有关入栈和出栈的操作算法

    问题描述: 设有两个栈s1.s2都釆用顺序栈方式,并且共享一个存储区[0, -, maxsize-1],为了尽量利用空间,减少溢出的可能,可釆用栈顶相向.迎面增长的存储方式.试设计s1.s2 有关入栈 ...

  9. C语言编程中的“堆”和“栈”七大不同之处

    对于编程初学者来说会接触到一些难以理解的名称,比如堆(heap).栈(stack).堆栈(stack)等.初学开发过程中往往让人混淆不清.今天我们来谈谈堆和栈的具体区别,来帮助初学者理清思路. 堆和栈 ...

最新文章

  1. jQuery验证控件jquery.validate.js使用说明+中文API
  2. redispython源文件_Redis与Python在项目中的交互
  3. 定义指令时“控制器”,“链接”和“编译”函数之间的区别
  4. 人类资产数字化是大势所趋
  5. Silverlight Unit Test Framework
  6. CCIE理论-第五篇-SDA-2
  7. 树莓派打造mini广播(FM)系统
  8. Web前端开发解耦1
  9. img标签过滤加fs模块实现图片文件缓存
  10. 单词计数 soj1076
  11. java~modelMapper需要注意的几点
  12. mysql Load Data InFile 的用法
  13. SSM项目源码基于ssm的NBA球队|篮球管理系统
  14. 人人网首页登录页面html码,仿人人网WordPress登陆注册界面
  15. 30行代码实现微信自动回复机器人
  16. 乓乓响再度冲刺港股:来自临时及应急服务客户毛利率达70%
  17. iText7 解套 (一) 原生方法输出带斜线表格
  18. jQuery+PHP实现微信大转盘抽奖 v1.0
  19. 中文图书期刊数据库文献检索
  20. VIC Image 驱动程序

热门文章

  1. 嵌套循环中的break和continue使用规则
  2. 可扩展性类毕业论文文献都有哪些?
  3. 什么是MyBatis?怎么操作MyBatis?
  4. 涅槃重生,力荐大型分布式手册,凤凰架构让你浴火成神,良心分享
  5. 英语说话方式的一点儿心得
  6. 如何将计算思维融合到C语言程序设计中,利用案例融合计算思维与C语言教学
  7. java 留言板源码_jsp+servlet+javabean实现简易留言板(包含数据库文件)
  8. CSS——低调的奢华
  9. 最全的博客、网站提交入口(备用)
  10. 钉钉通知-调用钉钉发送企业内部消息开发