一、概念

共享栈是为了优化一般栈的空间利用而提出的优化,在线性栈的两端设置两个栈,共用整个空间,即在一个数组空间中实现了两个栈。可能在实际中并不会用到,但是在题目考察中还是会出现的。
共享栈是为了更有效地利用存储空间,两个栈的空间相互调节,只有在整个存储空间被占满时才发生上溢。 其存取数据的时间复杂度均为 0(1),对存取效率没有什么影响。

二、定义

在纯数组形式上做改动,两个变量用于记录两个栈的栈顶元素位置。

struct Stack{int *data;int front;int back;
};

三、代码实现

本质上就是两个栈的混合,分别记为front和back,front是在前面的栈,初始化为-1,从头开始增加,back是在后面的栈,初始化为initsize,从尾部开始递减。特别的地方是判断是否满了,如果两个位置相隔为1,那么说明共享栈已满,不能再继续添加元素。

#include<bits/stdc++.h>
using namespace std;
int initsize=10;
struct Stack{int *data;int front;int back;
};
struct Stack s;
void init()
{s.front=-1;s.back=initsize;s.data=(int*)malloc(sizeof(int)*initsize);
}
bool push(int num,int tar)
{if(s.front+1==s.back)return false;if(tar==1)s.data[++s.front]=num;elses.data[--s.back]=num;return true;
}int pop(int tar)
{if(tar==1){if(s.front==-1)return -1;return s.data[s.front--];}else{if(s.back==initsize)return -1;return s.data[s.back++];}
}
bool isEmpty(int tar)
{if(tar==1){if(s.front==-1)return true;elsereturn false;}else{if(s.back==initsize)return true;elsereturn false;}
}
void print()
{if(isEmpty(1))printf("The front stack is empty!\n");else{printf("Front:"); while(!isEmpty(1))printf("%d ",pop(1));printf("\n");}if(isEmpty(2))printf("The back stack is empty!\n");else{printf("Front:");while(!isEmpty(2))printf("%d ",pop(2));printf("\n");} }void pushmode()
{int tar,num;printf("input the number and the target you want to push:");scanf("%d %d",&num,&tar);if(push(num,tar))printf("Push succeed!\n");elseprintf("ERROR\n");
}
void popmode()
{int tar;printf("Input the target you want to pop:");scanf("%d",&tar);if(!isEmpty(tar))printf("%d has been deleted\n",pop(tar));elseprintf("ERROR!\n");
}
int top()
{int tar;printf("Input the target you want to get:");scanf("%d",&tar);if(isEmpty(tar))printf("The stack is empty!\n");else{if(tar==1)printf("%d is the last number in the stack\n",s.data[s.front]);elseprintf("%d is the last number in the stack\n",s.data[s.back]);}
}
int main()
{init();int n,num,choice=-1;printf("Front stack:");scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&num);push(num,1);}printf("Back stack:");scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&num);push(num,2);}while(choice!=0){printf("1-Pop\n");printf("2-Push\n");printf("3-Top\n");printf("4-Show\n");printf("0-Exit\n");printf("Choice the function you want:");scanf("%d",&choice);switch(choice){case 1:popmode();break;case 2:pushmode();break;case 3:top();break;case 4:print();break;case 0:break;default:printf("input error!\n");break;}        }   free(s.data); return 0;
}

数据结构 3-1-2 共享栈相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 【数据结构】-共享栈

    共享栈 共享栈示意图 1.头文件及类型定义 2.共享栈类型定义 3.函数声明 4.基本操作 4.1 初始化共享栈 4.2 1号栈判空 4.3 2号栈判空 4.4 1号栈入栈 4.5 2号栈入栈 4.6 ...

  8. 【数据结构与算法】之栈与队列的应用和操作

    栈 一.概念 栈(stack)又名堆栈,它是一种运算受限的线性表: 限定仅在表尾进行插入和删除操作的线性表.允许插入和删除的一端为栈顶,另一端是栈底. 向一个栈插入新元素又称作进栈.入栈或压栈,它是把 ...

  9. 数据结构杂谈(五)——栈

    本文的所有代码均由C++编写 引用及参考资料: 王道数据结构 大话数据结构 超硬核十万字!全网最全 数据结构 代码,随便秒杀老师/面试官,我说的_hebtu666-CSDN博客 5 栈 5.1 引入 ...

最新文章

  1. Fiddler使用技巧:强大的数据文本编解码功能
  2. Spring Boot 应用迁移到 Java 11
  3. 记一次工作中的小BUG
  4. inx的c语言表达式,Spninx 解决的问题
  5. 基于SLIC分割的特征点检测
  6. js 查错_7年前端开发经验的我,写了本Vue.js实战开发,开源高清PDF下载
  7. 为什么说嵌入式开发比单片机要难很多?
  8. 上传文件的跨域处理(转)
  9. php 调用带返回多个结果集的方法,PHP中有多个结果集?
  10. centos上升级node_在centos7安装nodejs并升级nodejs到最新版本
  11. 数据标注——VoTT的学习笔记
  12. dockerfile中的env指令_Dockerfile中的ENV指令的具体使用详解
  13. 现代交换技术--交换概论
  14. 传感器学习——TB6612
  15. _stdcall与_cdecl区别
  16. 台式计算机如何自动开关机,联想电脑怎么设置定时开机|联想台式机自动开机设置方法...
  17. 福到了 分数 15作者 陈越单位 浙江大学
  18. 织梦栏目地址使用栏目名称首字母
  19. 360前端校招2019笔试编程题
  20. Redis实现点赞功能

热门文章

  1. property内存管理策略
  2. Nginx 中 nginx.conf 详解
  3. linux常用的日志分析脚本
  4. Hash Table in C
  5. 指向 类成员函数 指针的用法
  6. php内存泄漏的后果,记一次php内存泄漏的排查经过
  7. linux bash基本特性
  8. Android 标题栏(2)
  9. 基础笔记8(二)(容器-引用类型的排序)
  10. 设计模式——策略模式详解