1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "io.h"
  4. #include "math.h"
  5. #include "time.h"
  6.  
  7. #define OK 1
  8. #define ERROR 0
  9. #define TRUE 1
  10. #define FALSE 0
  11. #define MAXSIZE 20 /* 存储空间初始分配量 */
  12.  
  13. typedef int Status;
  14.  
  15. typedef int SElemType; /* SElemType类型根据实际情况而定,这里假设为int */
  16.  
  17. /* 两栈共享空间结构 */
  18. typedef struct
  19. {
  20. SElemType data[MAXSIZE];
  21. int top1; /* 栈1栈顶指针 */
  22. int top2; /* 栈2栈顶指针 */
  23. }SqDoubleStack;
  24.  
  25. Status visit(SElemType c)
  26. {
  27. printf("%d ",c);
  28. return OK;
  29. }
  30.  
  31. /* 构造一个空栈S */
  32. Status InitStack(SqDoubleStack *S)
  33. {
  34. S->top1=-;
  35. S->top2=MAXSIZE;
  36. return OK;
  37. }
  38.  
  39. /* 把S置为空栈 */
  40. Status ClearStack(SqDoubleStack *S)
  41. {
  42. S->top1=-;
  43. S->top2=MAXSIZE;
  44. return OK;
  45. }
  46.  
  47. /* 若栈S为空栈,则返回TRUE,否则返回FALSE */
  48. Status StackEmpty(SqDoubleStack S)
  49. {
  50. if (S.top1==- && S.top2==MAXSIZE)
  51. return TRUE;
  52. else
  53. return FALSE;
  54. }
  55.  
  56. /* 返回S的元素个数,即栈的长度 */
  57. int StackLength(SqDoubleStack S)
  58. {
  59. return (S.top1+)+(MAXSIZE--S.top2);
  60. }
  61.  
  62. /* 插入元素e为新的栈顶元素 */
  63. Status Push(SqDoubleStack *S,SElemType e,int stackNumber)
  64. {
  65. if (S->top1+==S->top2) /* 栈已满,不能再push新元素了 */
  66. return ERROR;
  67. if (stackNumber==) /* 栈1有元素进栈 */
  68. S->data[++S->top1]=e; /* 若是栈1则先top1+1后给数组元素赋值。 */
  69. else if (stackNumber==) /* 栈2有元素进栈 */
  70. S->data[--S->top2]=e; /* 若是栈2则先top2-1后给数组元素赋值。 */
  71. return OK;
  72. }
  73.  
  74. /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
  75. Status Pop(SqDoubleStack *S,SElemType *e,int stackNumber)
  76. {
  77. if (stackNumber==)
  78. {
  79. if (S->top1==-)
  80. return ERROR; /* 说明栈1已经是空栈,溢出 */
  81. *e=S->data[S->top1--]; /* 将栈1的栈顶元素出栈 */
  82. }
  83. else if (stackNumber==)
  84. {
  85. if (S->top2==MAXSIZE)
  86. return ERROR; /* 说明栈2已经是空栈,溢出 */
  87. *e=S->data[S->top2++]; /* 将栈2的栈顶元素出栈 */
  88. }
  89. return OK;
  90. }
  91.  
  92. Status StackTraverse(SqDoubleStack S)
  93. {
  94. int i;
  95. i=;
  96. while(i<S.top1)
  97. {
  98. visit(S.data[i++]);
  99. }
  100. i=S.top2;
  101. while(i<MAXSIZE)
  102. {
  103. visit(S.data[i++]);
  104. }
  105. printf("\n");
  106. return OK;
  107. }
  108.  
  109. int main()
  110. {
  111. int j;
  112. SqDoubleStack s;
  113. int e;
  114. if(InitStack(&s)==OK)
  115. {
  116. for(j=;j<=;j++)
  117. Push(&s,j,);
  118. for(j=MAXSIZE;j>=MAXSIZE-;j--)
  119. Push(&s,j,);
  120. }
  121.  
  122. printf("栈中元素依次为:");
  123. StackTraverse(s);
  124.  
  125. printf("当前栈中元素有:%d \n",StackLength(s));
  126.  
  127. Pop(&s,&e,);
  128. printf("弹出的栈顶元素 e=%d\n",e);
  129. printf("栈空否:%d(1:空 0:否)\n",StackEmpty(s));
  130.  
  131. for(j=;j<=MAXSIZE-;j++)
  132. Push(&s,j,);
  133.  
  134. printf("栈中元素依次为:");
  135. StackTraverse(s);
  136.  
  137. printf("栈满否:%d(1:否 0:满)\n",Push(&s,,));
  138.  
  139. ClearStack(&s);
  140. printf("清空栈后,栈空否:%d(1:空 0:否)\n",StackEmpty(s));
  141.  
  142. return ;
  143. }

02两栈共享空间_DoubleStack--(栈与队列)的更多相关文章

  1. 顺序栈与两栈共享空间-C语言实现

    栈是一种只能允许在栈顶插入数据与删除数据的数据结构,其实这就是一种特殊的线性表,特殊在 只能在表尾进行增减元素,上代码 #include <stdio.h> #define MAXSIZE ...

  2. 包含MIN函数的栈+一个数组实现两个堆栈+两个数组实现MIN栈

    1.题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 思路:利用一个辅助栈来存放最小值     栈  3,4,2,5,1     辅助栈 3,2,1 每入栈一次,就与辅 ...

  3. 递归&栈帧空间

    递归函数: 自己调用自己的函数 def digui(n): print(n) if n > 0: digui(n-1) print(n) digui(5) 执行结果: 5 4 3 2 1 0 0 ...

  4. Java描述表达式求值的两种解法:双栈结构和二叉树

    Java描述表达式求值的两种解法:双栈结构和二叉树 原题大意:表达式求值 求一个非负整数四则混合运算且含嵌套括号表达式的值.如: # 输入: 1+2*(6/2)-4 # 输出: 3.0 数据保证: 保 ...

  5. Java堆空间Vs栈内存

    之前我写了几篇有关Java垃圾收集的文章之后,我收到了很多电子邮件,请求解释Java堆空间,Java栈内存,Java中的内存分配以及它们之间的区别. 您可能在Java,Java EE书籍和教程中看到很 ...

  6. JVM 运行时数据区:程序计数器、Java 虚拟机栈和本地方法栈,方法区、堆以及直接内存

    Java 虚拟机可以看作一台抽象的计算机,如同真实的计算机,它也有自己的指令集和运行时内存区域. Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存(运行时内存区域)划分为若干个不同的数 ...

  7. 【JVM第三篇--运行时数据区】程序计数器、虚拟机栈、本地方法栈

    写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.运行时数据区 我们在编写Java程序时,使用JVM的流程主要如下所示: 虚拟机在 ...

  8. MySQL Innodb的两种表空间方式

    要说表空间,MySQL的表空间管理远远说不上完善.换句话说,事实上MySQL根本没有真正意义上的表空间管理.MySQL的Innodb包含两种表空间文件模式,默认的共享表空间和每个表分离的独立表空间.只 ...

  9. [原创]java WEB学习笔记59:Struts2学习之路---OGNL,值栈,读取对象栈中的对象的属性,读取 Context Map 里的对象的属性,调用字段和方法,数组,list,map

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. Java的面向对象思想

    多态性: 一种方法有多种实现,采用哪一种实现由Java虚拟机在运行时动态决定,这种能力成为动态绑定(dynamic binding),也称为多态性(polymorphism)(源于一个希腊单词,意为“ ...

  2. ecshop去官方化的修改

    1:如何修改网站"欢迎光临本店" 回答:languages\zh_cn\common.php文件中, $_LANG['welcome'] = '欢迎光临本店';将他修改成你需要的字 ...

  3. SQLite使用教程6 创建表

    http://www.runoob.com/sqlite/sqlite-create-table.html SQLite 创建表 SQLite 的 CREATE TABLE 语句用于在任何给定的数据库 ...

  4. Gitbook安装

    Gitbook安装 Gitbook是从NMP安装的,命令行: $ npm install gitbook -g 安装完之后,你可以检验下是否安装成功: $ gitbook -V 0.4.2 如果你看到 ...

  5. C#/Access-数据库获取自动编号的最大值

    //conStrSQL你改成你的access,我这里用的SQL2005string conStrSQL = "Data Source=xx.xx.xx.xx;Initial Catalog= ...

  6. git codes

    https://github.com/chibi-guts/DressUpProject https://github.com/TuttiFruttiFT/TFAndroid https://gith ...

  7. 【异构计算】OpenCL矩阵转置

    介绍 矩阵转置,主要的技巧还是利用好local memory ,防止local memory,以及glabol memory的读取尽量是合并读写. 完整代码一: main.cpp代码 #include ...

  8. ios开发——笔记篇

    :开关 BOOL isopen = !isopen; //View @property (nonatomic, assign) BOOL open;//模型属性 self.group.open = ! ...

  9. [原创]javascript prototype 对象 函数 <精简的美丽......>

    精简的美丽...... javascript prototype 对象 函数 在javascript中我们都知道创建一个对象使用如下代码var x = {}对象可以拥有属性和方法var x = {   ...

  10. [Effective C++ --005]了解C++默默编写并调用哪些函数

    <前言>编译器是个十分敬业的工作者,不但为你编译代码,甚至为你生成代码,不可思议吧.本文主要介绍编译器究竟会为我们生成和调用哪些代码. <空类和非空类>如果问什么样的类是空类? ...