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

2023-10-27

1、定义

两栈共享空间:使用一个数组来存储两个栈,让一个栈的栈底为该数组的始端,另一个栈的栈底为该数组的末端,两个栈从各自的端点向中间延伸。
在这里插入图片描述
栈1的底固定在下标为0的一端;
栈2的底固定在下标为StackSize-1的一端。
top1和top2分别为栈1和栈2的栈顶指针;
Stack_Size为整个数组空间的大小(图中用S表示);

2、性质

栈1为空:top1= -1
栈2为空:top2= Stack_Size
栈满:top1+1==top2

3、两栈共享空间类的声明

const int Stack_Size=100;  
template <class T>
class BothStack 
{
  public:
       BothStack( );
       ~BothStack( ); 
       void Push(int i, T x);   
       T Pop(int i);          
       T GetTop(int i);       
       bool Empty(int i);     
  private:
       T data[Stack_Size];     
       int top1, top2;        
};

4、插入

伪代码

1. 如果栈满,则抛出上溢异常;
2. 判断是插在栈1还是栈22.1 若在栈1插入,则
             2.1.1 top1加1;
             2.1.2 在top1处填入x;
       2.2 若在栈2插入,则
             2.2.1 top2减1;
             2.2.2 在top2处填入x;

实现

template <class T> 
void BothStack<T>::Push(int i, T x )
{
   if (top1==top2-1) 
   	throw "上溢";
   if (i==1) 
   	data[++top1]=x;
   if (i==2) 
   	data[--top2]=x;
}

5、删除

伪代码

1.若是在栈1删除,则
	1.1 若栈1为空栈,抛出下溢异常;
	1.2 删除并返回栈1的栈顶元素;
2.若是在栈2删除,则
	2.1 若栈2为空栈,抛出下溢异常;
	2.2 删除并返回栈2的栈顶元素;

实现

template <class T>
T BothStack<T>::Pop(int i){
   if (i==1) {   
       if (top1== -1) 	throw "下溢";
       return data[top1--];
   }
   if (i==2) {                           
       if (top2==StackSize)  	throw "下溢";
       return data[top2++]; 
  }
}

6、判断某个栈空算法

template <class T> 
bool BothStack<T>::Empty(int i)
{  
    if(i==1){
        if(top1==-1) 	return 1;
        else 	return 0;
    }
    if(i==2)	{
        if(top2==StackSize)	return 1;
        else  return 0;
    }
}

7、取某个栈栈顶的算法

template <class T> 
T BothStack<T>::GetTop(int i)
{
    if(i==1)	{
        if (top1!=-1) 	return data[top1];
    }
    if(i==2)	{
        if(top2!=StackSize)  return data[top2];
   } 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数据结构】两栈共享空间(双端栈) 的相关文章

  • 类和对象

    1 面向过程 在开发一个程序的时候 看中的是中间的过程 每一个过程步骤都需要自己去做 例如C语言 看中的是过程的开发 2 面向对象 当开发一个程序的时候 不看重具体的过程 看中谁能帮我去完成这件事情 找人 对象 帮我去做 前期去设计类的时候
  • N圆最密堆积、最小外接正方形的matlab求解(二维、三维等圆Packing 问题)

    圆形最密堆积 最小外接正方形的matlab求解 二维 三维等圆Packing 问题 0 前言 1 N个圆的最小外接正方形求解 2 N个球的最小外接立方体求解 惯例声明 本人没有相关的工程应用经验 只是纯粹对相关算法感兴趣才写此博客 所以如果
  • cesium for ue->CesiumRunTime

    共118个文件 23283行 含注释 截至2022年11月10日 剩下118个文件 23283行 截至2022年11月20日 剩下108个文件 21646行

随机推荐

  • react补充--hooks

    1 setState setState更新状态的2种写法 1 setState stateChange callback 对象式的setState 1 stateChange为状态改变对象 该对象可以体现出状态的更改 2 callback是
  • 「AIGC」智能美学,AI绘画 API 激发无限创意

    引言 随着人工智能 AI 技术的迅猛发展 AI绘画 API 正在以惊人的速度改变艺术创作的面貌 它不仅为艺术家和创作者提供了全新的创作工具 还激发了无限的创意和想象力 在这个智能美学的时代 让我们一起探索 AI 绘画 API 如何推动艺术创
  • 【转】数据库的设计(E-R图,数据库模型图,三大范式)

    一 数据库设计的概念 数据库设计是将数据库中的数据实体及这些数据实体之间的关系 进行规划和结构化的过程 二 数据库设计的重要性 如果一个数据库没有进行一个良好的设计 那么这个数据库完成之后他的缺点是 1 效率会很低 2更新和检索数据时会出现
  • python最大最小距离算法贴近度评价法

    1 大最小贴近度评价法 概念 贴近度表示两个模糊几何之间的彼此接近程度 在模糊模式识别方法中采用贴近度的大小识别待判别模糊子集的模式类别 为衡量待识别子集的类别 需要判别各个阶段与标杆模糊集合之间的相对贴近程度 上表中第一列是优化 标杆 模
  • 学习TensorFlow,TensorBoard可视化网络结构和参数

    在学习深度网络框架的过程中 我们发现一个问题 就是如何输出各层网络参数 用于更好地理解 调试和优化网络 针对这个问题 TensorFlow开发了一个特别有用的可视化工具包 TensorBoard 既可以显示网络结构 又可以显示训练和测试过程
  • 春招实习前端面试题汇总

    经历了两个月的复习 笔试 面试 现在总结一下 前端面试中我认为经常被问及的问题 计算机网络部分 tcp udp的区别 三次握手 四次挥手 谈谈你对http协议的理解 这里可以深入学习一下HTTPS http1 2 3 ws协议也可以了解 状
  • linux中,管道能够在同一进程中进行通信吗?

    linux中 管道能够在同一进程中进行通信吗 答案是否定的 管道是用于不同进程之间通信 不能再同一进程中进行通信 同一进程中 直接进行参数传递就行了 不设计通信问题 不同进程之间才需要通信 通信类别有多种 如管道 共享内容 其中 管道又有匿
  • 微服务---今年主要实践路

    福州 2021 04 01 潮湿 享受的天气 还是一如往常脑袋里还是昨天搭建4台服务遇到问题 今天提前1小时到公司 整理思路 今天讲一些普通知识记录 网站高手说明 Spring boot 是 Spring 的一套快速配置脚手架 可以基于sp
  • 第17课 处理边界(增加边界)

    文章目录 1 卷积边界问题 2 处理边界 2 1 BORDER DEFAULT 常用 2 2 BORDER CONSTANT 自定义指定像素值 2 3 BORDER REPLICATE 通过插值计算 2 4 BORDER WRAP 另外一边
  • PAT 5 分小组(字符串与字符转换)

    分小组 java 9名运动员参加比赛 需要分3组进行预赛 有哪些分组的方案呢 我们标记运动员为 A B C I下面的程序列出了所有的分组方法 该程序的正常输出为 ABC DEF GHI ABC DEG FHI ABC DEH FGI ABC
  • qt字符串和数字转换

    字符串转数字 qstring转整数的函数如下 qstring转浮点数的函数如下 字符串转十进制整数 QString str 123 int num str toInt 字符串转二进制 bool ok QString str 123 int
  • docker权限问题,ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running

    ERROR Couldn t connect to Docker daemon at http docker localunixsocket is it running 出现这个问题是因为当前用户权限的问题 只要将当前用户加入docker组
  • return R.ok()

    https www cnblogs com liuyi13535496566 p 11626533 html
  • 网络攻防——kali操作系统基本使用-调用摄像头

    1 阅读前的声明 本文章中生成的木马带有一定的攻击性 使用时请遵守网络安全相关的法律法规 恶意攻击操作系统属于违法行为 2 利用kali操作系统的metasploit攻击windows操作系统 kali中打开终端最好是进入root sudo
  • Spring Cloud Alibaba实战(八) - Dubbo + Nacos

    目录 一 Nacos动态配置 二 Nacos注册中心 三 Sentinel之限流 四 Sentinel之熔断 五 Gateway之路由 限流 六 Gateway之鉴权 日志 七 Gateway搭配Nacos实现动态路由 八 Dubbo Na
  • libcareplus生成热补丁文件

    libcareplus生成热补丁文件 kpatch gensrc汇编文件生成 使用kpatch strip的 strip裁剪不需要关注的节 使用kpatch strip的 rel fixup修正重定位信息 通过strip strip unn
  • Arduino制作温湿度计

    之前买的arduino套装 里面有一个LCD显示屏 就想用它加上手头的一些传感器做点实用的东西 顺便验证一下显示屏是否可用 于是想到了可以做一个温湿度计 实验目的 将温湿度传感器采集的温湿度显示在LCD显示屏上 首先准备工作 1 ardui
  • css区别margin、padding、width、height值为百分比

    margin padding设置为百分比 是相对父元素宽来说的 width设置百分比是相对父元素宽来说的 height设置百分比是相对父元素高来说的 使用padding占位的好处就是布局不会因为图片没有加载而改变
  • 4步教你打造好莱坞科幻特效

    大家一定有看过好莱坞电影 电影里的一幕大家一定印象深刻 男主角在电脑前熟练地敲着键盘 电脑屏幕飞快地闪动 字符也在快速跳动 很有科技感 这样的效果 在 Linux 下也可以实现 甚至连不懂任何 IT 技术的小白跟着本教程也可以轻松装13 我
  • 【数据结构】两栈共享空间(双端栈)

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