1.定义

共享栈:两个栈共享同一片内存空间,两个栈从两边往中间增长。

目的:节省内存空间。

空栈判断:一号栈的栈顶指针为-1,二号栈的栈顶指针为MaxSize。

栈满判断:一号栈的栈顶指针位置等于二号栈的栈顶指针-1。

2.代码

(1)定义结构体

typedef struct{int data[MaxSize];//一个存放栈中数据元素的结构体 int top1;//指向一号栈栈顶的指针int top2;// 指向二号栈栈顶的指针int size1;//记录一号栈大小 int size2; //记录二号栈大小 int search;//遍历指针
}SqStack;//定义栈的结构体 

(2)初始化栈

void InitStack(SqStack *S){//初始化 S->top1=-1;//1号栈的栈顶指针指向栈顶初始化位置 S->top2=MaxSize;//2号栈的栈顶指针指向栈尾初始位 S->size1 = 0;S->size2 = 0;S->search=-1;//遍历指针
}

(3)入栈操作

bool Push(SqStack *S,int pushNum){//一号栈入栈 if(S->top1==S->top2-1){//栈满 return false;//入栈失败 }S->data[++S->top1]=pushNum;//入栈 S->size1++;//栈长+1 return true;
}
bool Push2(SqStack *S,int pushNum){//二号栈入栈 if(S->top1==S->top2-1){//栈满 return false;//入栈失败 }S->data[--S->top2]=pushNum;//入栈 S->size2++;//栈长+1 return true;
}

(4)读取栈顶

bool ReadTop(SqStack *S,int *readNum){//一号栈读取栈顶元素 if(S->size1==0){//一号栈中没有元素 return false;}*readNum = S->data[S->top1];
//  printf("栈顶元素是%d\n",readNum);return true;
}
bool ReadTop2(SqStack *S,int *readNum){//二号栈读取栈顶元素 if(S->size2==0){//二号栈中没有元素 return false;}*readNum = S->data[S->top2];
//  printf("栈顶元素是%d\n",readNum);return true;
}

(5)出栈操作

bool Pop(SqStack *S,int *popNum){//一号栈出栈操作 if(S->size1==0){//一号栈中没有元素 return false;}*popNum = S->data[S->top1--];//和读栈的区别在出栈将栈顶指针下移一位S->size1--;//计数-1 return true;
}
bool Pop2(SqStack *S,int *popNum){//二号出栈操作 if(S->size2==0){//二号栈中没有元素 return false;}*popNum = S->data[S->top2++];//二号栈的栈顶指针和一号栈移动方向相反 S->size2--;//计数-1 return true;
}

(6)遍历整个栈存储空间

void TraversalStack(SqStack S){int Traversal = S.search+1;int record = 0;while(Traversal<MaxSize){record = S.data[Traversal];printf("%d\n",record);Traversal++;}}

 

3.整体代码

//共享栈
#include <stdio.h>
#include <stdlib.h>#define MaxSize 10//栈中元素的最大个数
//   -1是栈顶指针的初始化位置  [0,1,2,3,4,5,6,7,8,9]
typedef struct{int data[MaxSize];//一个存放栈中数据元素的结构体 int top1;//指向一号栈栈顶的指针int top2;// 指向二号栈栈顶的指针int size1;//记录一号栈大小 int size2; //记录二号栈大小 int search;//遍历指针
}SqStack;//定义栈的结构体 void InitStack(SqStack *S){//初始化 S->top1=-1;//1号栈的栈顶指针指向栈顶初始化位置 S->top2=MaxSize;//2号栈的栈顶指针指向栈尾初始位 S->size1 = 0;S->size2 = 0;S->search=-1;//遍历指针
}
bool Push(SqStack *S,int pushNum){//一号栈入栈 if(S->top1==S->top2-1){//栈满 return false;//入栈失败 }S->data[++S->top1]=pushNum;//入栈 S->size1++;//栈长+1 return true;
}
bool Push2(SqStack *S,int pushNum){//二号栈入栈 if(S->top1==S->top2-1){//栈满 return false;//入栈失败 }S->data[--S->top2]=pushNum;//入栈 S->size2++;//栈长+1 return true;
}
bool ReadTop(SqStack *S,int *readNum){//一号栈读取栈顶元素 if(S->size1==0){//一号栈中没有元素 return false;}*readNum = S->data[S->top1];
//  printf("栈顶元素是%d\n",readNum);return true;
}
bool ReadTop2(SqStack *S,int *readNum){//二号栈读取栈顶元素 if(S->size2==0){//二号栈中没有元素 return false;}*readNum = S->data[S->top2];
//  printf("栈顶元素是%d\n",readNum);return true;
}bool Pop(SqStack *S,int *popNum){//一号栈出栈操作 if(S->size1==0){//一号栈中没有元素 return false;}*popNum = S->data[S->top1--];//和读栈的区别在出栈将栈顶指针下移一位S->size1--;//计数-1 return true;
}
bool Pop2(SqStack *S,int *popNum){//二号出栈操作 if(S->size2==0){//二号栈中没有元素 return false;}*popNum = S->data[S->top2++];//二号栈的栈顶指针和一号栈移动方向相反 S->size2--;//计数-1 return true;
}void TraversalStack(SqStack S){int Traversal = S.search+1;int record = 0;while(Traversal<MaxSize){record = S.data[Traversal];printf("%d\n",record);Traversal++;}}int main(){bool flag = true;SqStack S;//声明一个顺序栈InitStack(&S);//初始化 //选择操作哪个栈int electStack = 0;printf("请输入要操作的栈(1 or 2):");scanf("%d",&electStack);while(electStack == 1 || electStack==2){if(electStack == 1){//使用一号栈 //入栈 int pushNum = 0;//记录入栈元素的变量 printf("请向栈中输入元素(输入99结束):");scanf("%d",&pushNum);while(pushNum != 99){flag=Push(&S,pushNum);//入栈 if(flag){printf("\n请向栈中输入元素(输入99结束):");scanf("%d",&pushNum);}else{printf("入栈失败");exit(0);}}//读栈int readNum = 0;ReadTop(&S,&readNum);//读取栈顶元素printf("栈顶元素是%d\n",readNum);//出栈int popNum = 0;//存储出栈元素的变量 char elect = NULL;//判断是否继续出栈的变量 printf("是否出栈元素(y|x):");scanf("%s",&elect);while(elect == 'y'){flag = Pop(&S,&popNum);    //调用出栈操作 if(flag == false){printf("\n栈已空");exit(0);}else{printf("\n出栈元素为%d",popNum);}printf("\n是否出栈元素(y|x):");scanf("%s",&elect);}TraversalStack(S);//遍历共享表 printf("请输入要操作的栈(1 or 2):");scanf("%d",&electStack);}else if(electStack == 2){//使用二号栈 //入栈 int pushNum = 0;//记录入栈元素的变量 printf("请向栈中输入元素(输入99结束):");scanf("%d",&pushNum);while(pushNum != 99){flag=Push2(&S,pushNum);//入栈 if(flag){printf("\n请向栈中输入元素(输入99结束):");scanf("%d",&pushNum);}else{printf("入栈失败");exit(0);}}//读栈int readNum = 0;ReadTop2(&S,&readNum);//读取栈顶元素printf("栈顶元素是%d\n",readNum);//出栈int popNum = 0;//存储出栈元素的变量 char elect = NULL;//判断是否继续出栈的变量 printf("是否出栈元素(y|x):");scanf("%s",&elect);while(elect == 'y'){flag = Pop2(&S,&popNum);   //调用出栈操作 if(flag == false){printf("\n栈已空");exit(0);}else{printf("\n出栈元素为%d",popNum);}printf("\n是否出栈元素(y|x):");scanf("%s",&elect);}TraversalStack(S);//遍历共享表printf("请输入要操作的栈(1 or 2):");scanf("%d",&electStack);}} } 

数据结构(共享栈的实现)相关推荐

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

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

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

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

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

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

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

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

最新文章

  1. 社交网络图挖掘4--三角形计数问题
  2. 【原】自定义UINavigationItem的两种方法以及相应的隐藏方法
  3. nagios 3.2安装详解(一)
  4. 【Android 逆向】代码调试器开发 ( ptrace 函数 | 读取进程内存数据 )
  5. HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容
  6. 英特尔开源WebRTC开发套件OWT
  7. 常见窗函数的C语言实现及其形状,适用于单片机、DSP作FFT运算
  8. java中如何将JScrollPane的垂直滚动条自动移动到最下端
  9. word2vec需要去标点吗_word2vec训练词向量前期处理-中文分词等
  10. java 不同时区时间转换_Java中的时区转换小结
  11. 微信小程序蓝牙连接TSPL打印机打印图片思路
  12. Safari怎么开发扩展(插件)
  13. MacOs 查看本地IP和Mac地址
  14. 轻量级微信动态活码生成管理源码
  15. 206计算机毕业设计
  16. 流体的“流线”和“迹线”定义和区别。
  17. 小程序 固定位置元素 遮挡其他元素_西门子S7-200 SMART切换编程编辑器、输入LAD程序、编辑程序...
  18. RT-Thread串口设备驱动框架
  19. JMM到底如何理解?JMM与MESI到底有没有关系?
  20. C#“同步调用”、“异步调用”、“异步回调”

热门文章

  1. 训练赛一:bfs广搜题目 CF115B Lawnmower
  2. git 重置用户名和密码
  3. 鸿蒙系统怎么没有微信界面,如果鸿蒙系统没有微信,你会选择用吗?
  4. FMX探索之IMAGE控件上输出
  5. Collections的用法
  6. 你必须要知道CNN模型:ResNet
  7. 转战物联网·基础篇01-物联网之我见
  8. RecyclerView详解一,使用及缓存机制
  9. 毕业论文管理系统(类图、ER图)、时序图
  10. Security(安全框架)