双向栈就是利用一个数组的两端作为栈顶,同时向数组中间增长,实现一个数组由两个栈共享

结合书本上的内容我在此发表一些我的理解:

1.双堆栈的建立

首先由图中能看出建立一个双堆栈我们需要一个数组,两个栈顶指针Top1和Top2,同时我们还需要定义数组的最大长度MaxSize。在最初数组中没有存放元素,所以栈顶指针1和栈顶指针2都不会指向数组中的位置,所以初始化双堆栈时栈顶指针1指向的位置是数组最左边位置0的前一个位置即-1,而栈顶指针2就指向数组最右端的位置MaxSize-1的下一个位置即MaxSize。这样我们就可以写出以下双堆栈的初始化代码:

//双堆栈的定义
typedef int Position;
typedef int ElementType;
typedef struct SNode *PrtToSNode;
struct SNode{ElementType * Data;Position Top1;Position Top2;int MaxSize;
};
typedef PrtToSNode Stack;//双堆栈初始化方法
Stack MakeStack(){Stack S=(Stack)malloc(sizeof(struct SNode));//为双堆栈申请空间S->Data=(ElementType*)malloc(MaxLen*sizeof(ElementType));//为双堆栈中的数组申请空间S->MaxSize=MaxLen;//MaxLen即宏定义的数组长度S->Top1=-1;S->Top2=MaxLen;return S;
}

2.双堆栈的入栈操作

双堆栈入栈时要指明是要入栈1还是栈2,因此可以定义一个Tag来指明对哪个栈进行操作,并且我们还要判断一下当前栈是否已经满了,如果满了当然就不能入栈了,所以可以创建一个判断是否栈满的函数。那么怎么判断栈已经满了呢?

由图中可以看出当栈顶指针1和2相邻时栈就已经满了。所以栈顶指针1的位置+1=栈顶指针2的位置时说明栈已满,因此可以写出以下代码:

bool IsFull(Stack S){if((S->Top1+1)==S->Top2){return TRUE;}return FALSE;
}

如果此时栈不满我们就可以进行入栈操作了。

入栈的操作很简单,就是先将指针向前移动一位,然后再将要入栈的元素放入即可。因为两个栈的方向是相反的,所以此时堆栈1指针操作是加1,而堆栈2指针的操作就是减1了。入栈方法代码如下:

bool Push(Stack S,ElementType X,int Tag){if(IsFull(S)){printf("堆栈满");return FALSE;}else{if(Tag==1){S->Top1++;S->Data[S->Top1]=X;return TRUE;}if(Tag==2){S->Top2--;S->Data[S->Top2]=X;return TRUE;}}return FALSE;
}

3.双堆栈的出栈操作

双堆栈出栈操作也要先指明要出哪个栈,因此和上边一样可以引入一个Tag来确定对哪个栈操作。

出栈第一步当然是判空,当栈顶指针1的位置是-1时说明堆栈1为空,当栈顶指针2的位置是MaxSize时说明堆栈2为空,因此可以再定义一个判空方法:

bool IsEmpty(Stack S,int Tag){if(Tag==1&&S->Top1==-1){return TRUE;}if(Tag==2&&S->Top2==MaxLen){return TRUE;}return FALSE;
}

当堆栈不为空时我们就可以进行出栈操作了

由于出栈的方法返回的是被出栈的元素,所以此时我们就要先拿到元素再移动栈顶指针了,否则我们拿到的就不是要出栈的元素了。出栈方法代码如下:


ElementType Pop(Stack S,int Tag){if(IsEmpty(S,Tag)){printf("目标堆栈空");return ERROR;}else{if(Tag==1){ElementType X=S->Data[S->Top1];//X即是要出栈的元素S->Top1--;return X;}if(Tag==2){ElementType X=S->Data[S->Top2];S->Top2++;return X;}}return ERROR;
}

由于是第一次写文章,并没有什么经验,有不好的地方希望大家能够指出。同时希望这篇文章能够对大家学习堆栈有所帮助。

【C语言】用一个数组实现两个堆栈相关推荐

  1. 用一个数组实现两个堆栈

    题干 请用一个数组实现两个堆栈,要求最大可能地利用数组空间,使数组只要有空间.入栈操作就能成功.写出相应的入栈和出栈操作函数. 分析 第一种方案,是将数组空间一分为二地分配给两个堆栈使用,一个堆栈的底 ...

  2. 一个数组实现两个栈(共享栈)

    题目:   一个数组实现两个栈. 方法1:   下标为0的位置为栈1的栈底,下标为1的位置为栈2的栈底,栈1的元素存放在下标为偶数的位置上,栈2的元素放在下标为奇数的位置上.   如上图所示的数组:若 ...

  3. c语言把一个数组赋值给另一个数组_如何把一个固定数组的值传递给另外一个数组...

    大家好,今日我们继续讲解VBA数组与字典解决方案,今日讲解的是第34讲:数组的传递.在应用数组的时候,我们往往需要要把数组的值由一个数组传递给另外一个数组,就如同变量的传递一样: A=B '把B值赋给 ...

  4. (C语言)写一个函数,实现两个字符串的比较, 即自己写一个strcmp函数,函数原型为int strcmp(const char* p1, const char* p2)

    写一个函数,实现两个字符串的比较, 即自己写一个strcmp函数,函数原型为int strcmp(const char* p1, const char* p2);设p1指向字符串s1,p2指向字符串s ...

  5. c语言如何让数组的两个数据调换位置_浅论数据结构

    数据结构的英文写法叫Data Structure,看这两个单词我们大体就明白了其中所蕴含的意义.它包括两个元素: 数据 结构 数据当然是可以是任意类型的数据,比如char,int,short int ...

  6. c语言放空一个数组,数组越界真可怕,莫名就闯到了别人家

    4本文引用地址:http://www.eepw.com.cn/article/201811/395096.htm 笔者曾经在<天灵灵地灵灵,遥控为何会失灵>一文中讲述过报文解析程序的一部分 ...

  7. c语言放空一个数组,C++语言

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 本章学习字符相关内容. 让我们从介绍字符型(char)开始. 字符型,顾名思义,就是可以保存字符的数据类型,与int.d ...

  8. C语言求一个数组中第k大的数,leetcode | Median of Two Sorted Arrays 寻找2个有序数组中第k大的值...

    There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...

  9. c语言创建字符串数组的两种方式

    字符串数组可以使用: (1)char a[] [10]; 用二维数组表示,c语言没有字符串关键字,所以只能用一维数组来表示字符串 例如: char a[] ="abcd"; (2) ...

最新文章

  1. 点击除元素以外的任意地方隐藏元素js
  2. 未来智能社会的一砖一瓦都需要今天我们一点点的探索发现!
  3. printf按8进制、16进制输出
  4. js把日期字符串转换成时间戳
  5. XEIM|XEIM企业即时通讯
  6. 斯坦福 CS228 概率图模型中文讲义 三、实际应用
  7. Linux环境编程:fork系统调用及其陷阱 - 内存复用,文件不复用
  8. oracle删除临时表空间语句,Oracle中临时表空间的清理
  9. container_of宏定义分析---linux内核
  10. 地方旅游网站源码,PHP开源,PC+WAP+微信三合一,免费分享
  11. keil5安装教程简单易上手
  12. 目标跟踪论文整理(不全,以单目标为主)
  13. LabVIEW色彩匹配实现颜色识别、颜色检验(基础篇—13)
  14. Apache 服务器特点
  15. IntelliJ IDEA CE 2019.2 发布
  16. 【转】给大家分享一下目前mlc颗粒的内存卡资料
  17. RK3308 WIFI驱动调试
  18. 固定资产条码管理系统软件如何来管控制造家具行业资产?
  19. Grunt搭建自动化web前端开发环境--完整流程
  20. 人工智能的历史与演变

热门文章

  1. 提权学习:第三方软件提权(破解hash 提权、MFS 破解hash 提权、GetPass 破解hash提权、QuarksPwDump 破解hash提权)
  2. 【送书福利】图论算法:如何找到最适合自己的另一半 ?
  3. SpringBoot如何实现导出Excel表格
  4. html中div设置图片居中显示,图片在DIV中居中显示的方法
  5. 【JavaWeb】web开发中的绝对路径和相对路径
  6. Ubuntu训练tflite模型
  7. 新手卖家必看,最新Lazada发货模式
  8. PyQT 跟我学做密码管理器(1)
  9. 以太坊基金会:前路,2018
  10. iOS 切圆角 任意几个角