#ifndef DOUBLESTACK_H
#define DOUBLESTACK_H
/*(1)引入1.如果需要两个相同类型的栈(顺序结构), 分别为了两个栈开辟存储空间。极有可能出现的情况是栈1已经满了,而栈2还有很多空闲区域。这样就不合理。2.解决方法是使用一个数组来同时存储两个这两个栈,这样可以让两个顺序结构栈动态获得存储空间3.两栈共享存储空间的好处是:节省存储空间,降低上溢的可能性。4.适用场景:两个栈的空间需求有相反关系(一个需求增加会导致另一个需求下降)时使用。(2)存储结构数组[bottom1,1,2,3,top1,...,top2,4,9,6,bottom2]     // 数组长度为MAXSIZE说明:1.栈1在左边,栈2在右边2.栈1向右增长,栈2向左增长。(3)栈的判定条件1.栈1为空top1 == 02.栈2为空top2 == MAXSIZE3.存储空间已满top1 +1 == top2(4)压栈1.存储空间已满就退出2.如果压入栈1top1的下项存储新元素,top1+12.如果压入栈2top2的前项存储新元素,top1-1(5)弹栈2.如果弹栈1如果栈为空,退出。删除top1的那一项,top1-1.2.如果弹栈2如果栈为空,退出。删除top2的那一项,top1+1.*/
#define MAXSIZE 8   // 数组的最大长度
#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef int DElemType;
typedef enum StackNum{STACK1 = 1,STACK2,
}StackNum;
typedef struct DoubleStack{DElemType data[MAXSIZE];int top1;   // 栈1的栈顶在数组中的下标int top2;   // 栈2的栈顶在数组中的下标
}DoubleStack;// 初始化双栈
int Init_DoubleStack(DoubleStack *s)
{if (!s)return -1;memset(s, 0, sizeof(DoubleStack));s->top1 = -1;            // 栈1的栈顶从数组最左端开始,往右增长.s->top2 = MAXSIZE;    // 栈2的栈顶从数组最右端开始,往左增长.
}// 栈1是空的
int Stack1Empty(DoubleStack *s)
{return (s->top1 == -1);
}
// 栈2是空的
int Stack2Empty(DoubleStack *s)
{return (s->top2 == MAXSIZE);
}
// 数组满了,不可再压入元素
int StackFull(DoubleStack *s)
{return ((s->top1+1) == s->top2);
}
int StackEmpty(DoubleStack *s)
{return (Stack1Empty(s) && Stack2Empty(s));
}
void DoubleStackInfo(DoubleStack *s)
{if (s->top1 != -1) {printf("stack1:");for(int i=0; i<= s->top1;i++){printf("%d, ", s->data[i]);}}if (s->top2 != MAXSIZE) {printf("stack2:");for(int i=MAXSIZE-1; i>= s->top2;i--){printf("%d, ", s->data[i]);}}if (StackEmpty(s))printf("stack is empty");printf("\n");
}// 新元素e放入栈num
int DoubleStackPush(DoubleStack *s,StackNum num, DElemType e)
{if (StackFull(s) || !s)return -1;if (num == STACK1) {s->data[++s->top1] = e;}else if (num == STACK2){s->data[--s->top2] = e;}return 0;
}
// 从栈num中弹出一个元素,而用于返回其值
int DoubleStackPop(DoubleStack *s,StackNum num, DElemType *e)
{if (!s || !e)return -1;if (num == STACK1) {if (Stack1Empty(s))return -1;*e = s->data[s->top1--];}else if (num == STACK2){if (Stack2Empty(s))return -1;*e = s->data[s->top2++];}return 0;
}
#endif // DOUBLESTACK_H

两栈共享存储空间(线性结构栈)相关推荐

  1. 两栈共享存储空间算法

    我们知道栈是一种先进后出的结构,我们用顺序存储结构进行实现,也是很方便的,唯一的缺陷就是必须事先确定数组存储空间大小,万一不够用了,就需要编程手段扩展数组容量,非常麻烦.对于一个栈,我们只能经理设计出 ...

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

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

  3. 双栈共享存储空间(C++代码实现)

    理论部分 理论来源:b站up主:跟懒猫老师快乐数据结构 C++代码 #include<iostream> using namespace std; const int STACKSIZE ...

  4. 【JS数据结构】线性结构——栈结构

    目录 一. 认识栈结构 1.栈结构 1.1 栈(stack) 1.2 生活中类似于栈的 1.3 栈结构的图解 1.4 程序中的函数调用栈是使用栈实现的呢? 1.5 栈面试题 二. 栈结构实现 1.栈的 ...

  5. 【数据结构(郝斌)】03线性结构-栈

    数据结构-栈 什么是栈 静态栈 动态栈 区别: 静态栈 动态栈 操作 栈的标准库操作 动态栈的操作实现 操作 void initStack(PSTACK s) void pushStack(PSTAC ...

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

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

  7. 线性结构--栈--特点--结构--概念

    特殊线性表-栈: 与常规线性表有神么差别?在本质上是没有什么差别的,只是在运算规则上有较大的差距,具体请看以下介绍. 栈是被限制只能在一端进行插入和删除运算的线性表,可以使用的一端称为栈顶,不能使用的 ...

  8. 线性结构 —— 栈与队列

    [概述] stack 和 queue 是在程序设计中经常会用到的数据容器,STL 提供了方便的堆栈.队列的实现,准确地说,STL 中的 stack 与 queue 不同于 pair.vector 等容 ...

  9. 数据结构 c++用栈实现四则运算_数据结构之线性结构——栈的四则运算实现

    目标: 用栈来自己编写程序,实现四则运算 拆解: 1. 任何表达式都由 操作数.运算符.定界符 组成 操作数即为参与计算的数值 运算符(这里只讨论算术运算符)有优先级之分 定界符可以改变运算次序 2. ...

最新文章

  1. 使用 Gatsby.js 搭建静态博客 EX 使用语雀发布到博客
  2. Python黑客编程基础3网络数据监听和过滤
  3. 前端辅助开发工具积累
  4. 微信快速开发框架(九)-- V3.0发布,代码已更新至Github 新增微店功能
  5. nacos1.2(1.3)的下载及CentOS7下安装nacos
  6. python sort dict 总结
  7. JZOJ 1235. 洪水
  8. vue动态请求到的多重数组循环遍历,取值问题,如果某个值存在则显示,不存在则不显示。...
  9. HDU 5857 - Median ( 查询模拟 + 思路 )
  10. Decorator设计模式(装饰)
  11. H+ HPlus创建新的标签页/选项卡
  12. Flexsim——初学AGV必看的知识点(如何解决AGV在不同区域speed不同)
  13. faster RCNN
  14. flash遮罩弹性跟随效果
  15. 扇贝单词里有计算机英语吗,扇贝单词英语版
  16. Winform面试题
  17. 3D数据基础——向量介绍与3D向量类的实现
  18. 什么是股票配资app?
  19. Ubuntu与windows之间实现复制粘贴
  20. 倾斜摄影超大场景的三维模型的顶层合并的轻量化处理技术

热门文章

  1. 显卡花屏显存测试软件6,在线等,显卡花屏.测试结果如何分辨那个显存坏了
  2. 毕业设计-基于微信小程序与云开发的成绩查询系统
  3. oralce_函数使用
  4. 二级c语言基础题库(1)
  5. CRITICAL_SECTION的使用方法——模拟售票功能
  6. 【NA】拉格朗日插值法
  7. 常用的协议端口号(TCP and UDP)
  8. 认真学习InnoDB的数据存储结构中的区、段与表空间
  9. java 使用jacob实现word转pdf
  10. windows查看密码工具