共享顺序栈:内部也是一个数组
将两个栈放在数组的两端,一个从数组首端开始压栈,一个从数组尾部开始压栈,等到两边栈顶在中间相遇时,栈满。
共享顺序栈在某些情况下可以节省空间。

头文件 sharingStack.h

//共享顺序栈
// Created by mingm on 2019/3/28.
//
#ifndef STACK_SHARINGSTACK_H
#define STACK_SHARINGSTACK_H#include <iostream>
template <class T> class sharingStack
{private:int top[2], bot[2]; //双栈的栈顶指针和栈底指针T* arr;     //栈数组int capacity;   //栈容量
public:sharingStack(int size = 10);    //初始化,总容量默认10~sharingStack(){delete [] arr;arr = NULL;}void push(const T& data, int stackIndex);    //将数据压入index号栈内int pop(int stackIndex);        //将index号栈顶元素弹出T* getTop(int stackIndex);      //返回index号栈顶元素bool empty(int stackIndex) const    //判断是否为空{return top[stackIndex] == bot[stackIndex];}bool full() const   //判断栈是否满{return top[0]+1 == top[1];}void clear(int stackIndex);     //清空index号栈void printOneSide(int stackIndex) const;    //打印一侧栈void printAll() const;                      //打印所有
};#endif //STACK_SHARINGSTACK_H

共享顺序栈 类实现 sharingStack.cpp

//共享顺序栈
// Created by mingm on 2019/3/28.
//
#include "sharingStack.h"
//#include <assert.h>
#include <iostream>
template <class T>
sharingStack<T>::sharingStack(int size):capacity(size)
{top[0] = -1;bot[0] = -1;top[1] = size;bot[1] = size;arr = new T [size];
}
template <class T>
void sharingStack<T>::push(const T &data, int stackIndex)
{//    assert(!full());    //如果栈满了(条件为false),程序终止if(full())throw("stack is full !");if(stackIndex == 0)arr[++top[0]] = data;elsearr[--top[1]] = data;
}
template <class T>
int sharingStack<T>::pop(int stackIndex)
{if(empty(stackIndex))return 0;if(stackIndex == 0)top[0]--;elsetop[1]++;return 1;
}
template <class T>
T* sharingStack<T>::getTop(int stackIndex)
{if(empty(stackIndex))return NULL;return &arr[top[stackIndex]];
}
template <class T>
void sharingStack<T>::clear(int stackIndex)
{if(stackIndex == 0)top[0] = bot[0] = -1;elsetop[1] = bot[1] = capacity;
}
template <class T>
void sharingStack<T>::printOneSide(int stackIndex) const
{if(empty(stackIndex)){std::cout << "----Stack " << stackIndex << " is empty---- " << std::endl;return;}else{if(stackIndex == 0){std::cout << "----Stack " << stackIndex << " bottom---- " << top[stackIndex]+1 << " elem(s)" << std::endl;for(int i = bot[0]+1; i<= top[0]; ++i){std::cout << arr[i] << std::endl;}std::cout << "----Stack " << stackIndex << " top---- " << top[stackIndex]+1 << " elem(s)" << std::endl;}else{std::cout << "----Stack " << stackIndex << " top---- " << bot[stackIndex]-top[stackIndex] << " elem(s)" << std::endl;for(int i = top[1]; i< bot[1]; ++i){std::cout << arr[i] << std::endl;}std::cout << "----Stack " << stackIndex << " bottom---- " << bot[stackIndex]-top[stackIndex] << " elem(s)" << std::endl;}}
}
template <class T>
void sharingStack<T>::printAll() const
{std::cout << "****capacity of doubleStack is " << capacity << " *****" << std::endl;printOneSide(0);printOneSide(1);std::cout << "*******************************************" << std::endl;
}

测试主程序 sharingStack_testMain.cpp

//
// Created by mingm on 2019/3/28.
//
#include "sharingStack.cpp"
#include <iostream>
using namespace std;
int main()
{int L[3] = {0,3,4};int len1 = 5, len2;for(int k = 0; k < 3; ++k){len2 = L[k];sharingStack<int> doubleIntStack(8);for(int i = 0; i < len1; ++i){try{doubleIntStack.push(i,0);}catch(const char* ch){cout << ch << endl;break;}}for(int i = 0; i < len2; ++i){try{doubleIntStack.push(i,1);}catch(const char* ch){cout << ch << endl;break;}}doubleIntStack.printAll();}return 0;
}

valgrind检查结果

上面给定栈容量8,#0栈长度5,让#1栈长度分别为0,3,4,当为4时栈满溢出。

数据结构--栈--共享顺序栈相关推荐

  1. 数据结构栈(顺序栈、链栈、插入push、删除pop)、队(循环队,链队、入队push,出队pop)知识点梳理

    数据结构栈知识点梳理 一 栈的定义 栈(stack)是限定仅在表尾进行插入和删除操作的线性表 不含任何元素的栈称为空栈 允许插入和删除的一端成为栈顶(top),另一端称为栈底(bottom) 具有LI ...

  2. 【Python数据结构系列】❤️《栈(顺序栈与链栈)》——❤️知识点讲解+代码实现

    灵魂拷问:为什么要学数据结构? 数据结构,直白地理解,就是研究数据的存储方式.数据存储只有一个目的,即为了方便后期对数据的再利用.因此,数据在计算机存储空间的存放,决不是胡乱的,这就要求我们选择一种好 ...

  3. 数据结构学习笔记——栈的基本知识和顺序存储结构实现栈(顺序栈)

    目录 一.栈 (一)栈的概念 (二)栈的排列 (三)共享栈 (四)栈的常见应用 二.顺序栈的定义 三.顺序栈的初始化 四.判断顺序栈是否为空栈 五.判断顺序栈是否为满栈 六.进栈(插入操作) 七.出栈 ...

  4. java栈实现--顺序栈

    顺序栈 一.实现过程 1.提供栈接口:IStack 2.提供顺序栈的实现:ShunxuStack 3.提供判空(isEmpty).栈深度(length)等计算方法. 4.提供清空栈的方法:clear( ...

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

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

  6. 数据结构基础(6) --顺序栈的设计与实现

    栈是一种只允许在一端进行插入或删除操作的线性表.其特点为:先进后出(FILO)/后进先出(LIFO); 栈 VS. 队列 栈和队列都是动态集合, 但在栈中, 可以去掉的是最近插入的那一个,:栈实现了一 ...

  7. 卜若的代码笔记-数据结构系列-第十章:栈一.顺序栈(数组栈)

    1.栈有两种写法,一种是以数组为躯干的顺序栈,一种是以链表为躯干的链式栈. 1.1栈的操作 1.1.1 出栈pop()函数 允许栈出,栈出之后,顶数据有移除操作. 时间复杂度o(1) 1.1.2 入栈 ...

  8. c语言建立栈(顺序栈、双栈和链式栈)

    c语言建立栈 顺序存储 栈的顺序存储定义 初始化栈 入栈操作 出栈操作 其余操作 读取栈顶元素 栈中元素个数 栈是否为空 双栈 双栈的顺序存储结构定义 建立双栈 判断栈为空 进栈操作 出栈操作 链式栈 ...

  9. java顺序栈_顺序栈的基本操作(入栈和出栈)

    顺序栈的基本操作(入栈和出栈) 顺序栈,即用顺序表实现栈存储结构.通过前面的学习我们知道,使用栈存储结构操作数据元素必须遵守 "先进后出" 的原则,本节就 "如何使用顺序 ...

最新文章

  1. Python数据框结合lambda函数的使用
  2. 不同真菌物种注释数据库对群落组成的影响
  3. Marketing Cloud extension field technical name
  4. python 爬虫可视化编程_Python爬虫爬取博客实现可视化过程解析
  5. 【资源】史上最全数据集汇总
  6. Android setBackgroundResource和setBackgroundDrawable和用法
  7. msys2软件包管理工具pacman常用命令
  8. python3内置函数_python3--内置函数
  9. 2021年,开发者们如何拥抱 5G 消息?
  10. 【12c】12c RMAN新特性之通过网络远程恢复数据库(RESTORE/Recover from Service)
  11. 2021认证杯第二阶段数学建模思路论文交流群:984771555
  12. 论文绘图与合成图片过程中常见问题
  13. 卷尺精度标准_钢卷尺精度等级介绍
  14. 河北工业职业技术学院计算机怎样,河北工业职业技术学院宿舍怎么样 住宿条件好不好...
  15. 用turtle模块画小猪佩奇
  16. sun java 考试_Sun Java认证考试科目
  17. 5000字长文:电商运营如何做好数据分析?
  18. html a3纸大小,a0-a3纸的尺寸具体大小介绍【图文】
  19. 网络掉包分析工具mtr
  20. 【怀旧】利用Altair 8800模拟器加载4K Basic解释器(附下载连接)

热门文章

  1. mysql5.7.17 win7_win7下mysql5.7.17安装配置方法图文教程
  2. uboot源码——命令体系
  3. url编码函数encodeURI和encodeURIComponent
  4. python学习笔记(二十)初识面向对象
  5. windows phone 7 中文天气预报应用--来源http://www.cnblogs.com/liulunet/archive/2011/08/17/2141696.html...
  6. 最详细的U-BOOT源码分析及移植
  7. OV7725的帧率和PCLK寄存器设置
  8. DirectShow 在VS2005中环境配置
  9. svn: E200033: database is locked, executing statement 'RELEASE   s0' 问题解决办法
  10. Intent介绍及Intent在Activity中的使用方法