1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define STACK_INIT_SIZE 100
  4. #define STACKINCREMENT 10 //stackincrement
  5. #define OVERFLOW -2
  6. #define OK 1
  7. #define ERROR 0
  8. typedef struct{
  9. int *base;
  10. int *top;
  11. int stacksize;
  12.  
  13. }SqStack;
  14.  
  15. //构建空栈
  16. int InitStack(SqStack &S){
  17. S.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
  18. if(!S.base)exit(OVERFLOW);
  19. S.top=S.base; //构建空栈
  20. S.stacksize=STACK_INIT_SIZE;
  21. printf("\n空栈创建成功!!\n\n");
  22. return OK;
  23. }
  24.  
  25. //插入元素为栈顶元素
  26.  
  27. int Push(SqStack &S,int e){
  28. //插入数据为依次插入
  29. printf("\n请输入插入的数据:");
  30. scanf("%d",&e);
  31. if(S.top-S.base>S.stacksize){
  32. S.base=(int *)realloc(S.base,S.stacksize+STACKINCREMENT*sizeof(int));//栈满 ,加空间
  33. if(!S.base)exit(OVERFLOW);
  34. S.top=S.base+S.stacksize;
  35. S.stacksize+=STACKINCREMENT;
  36. }
  37. *S.top++=e;//存入数据
  38. printf("\n数据插入成功!!");
  39. return OK;
  40. }
  41. //删除栈顶元素
  42. int Pop(SqStack &S,int &e){
  43. //删除元素为最后一个数
  44. if(S.top==S.base){
  45. printf("\n栈为空!!无法继续删除!!");
  46. return ERROR;
  47. }
  48. e=*--S.top;
  49. printf("\n删除的元素为:%d",e);
  50. printf("\n\n删除成功!!");
  51. return OK;
  52. }
  53. // 判断是否为空栈
  54. int StackEmpty(SqStack S){
  55. if(S.top==S.base) return OK;
  56. else return ERROR;
  57.  
  58. }
  59.  
  60. //获取栈顶元素
  61. int GetTop(SqStack S,int &e){
  62. if(S.top==S.base) {
  63. printf("栈为空!!");
  64. return ERROR;
  65. }
  66. e=*(S.top-);
  67. printf("\n存储的栈顶元素为:%d",e);
  68. return OK;
  69. }
  70.  
  71. //查找元素
  72. /*
  73. int GetElem_Sk(SqStack &S,int i,int &e){
  74. printf("请输入查找元素的位置:");
  75. scanf("%d",&i);
  76.  
  77. if(i<1||i>(S.top-S.base)){
  78. printf("元素不在栈空间内!!");
  79. return ERROR;
  80. }
  81. e=*(S.base++);
  82. printf("查找的元素为:%d",e);
  83. return OK;
  84. }
  85. */
  86. //创建栈,并可存入数据
  87. int creatlist(SqStack &S){
  88. int i,n;
  89. printf("请用户存入数据\n\n请选择存入数据个数:");
  90. scanf("%d",&n);
  91. while(n<=){
  92. printf("\n存入个数小于了“1”,请重新存入:");
  93. scanf("%d",&n);
  94. }
  95. /* if(n>(S.top-S.base)){
  96. printf("-----------");
  97. S.base=(int *)realloc(S.base,S.stacksize+STACKINCREMENT*sizeof(int));
  98. if(!S.base)exit(OVERFLOW);
  99. S.top=S.base+S.stacksize;
  100. S.stacksize+=STACKINCREMENT;
  101. }*/
  102. printf("\n请输入%d个数据:\n\n",n);
  103.  
  104. for(i=;i<=n;i++){
  105. printf("请输入第%d个元素(请回车结束):",i);
  106. ++S.top;
  107. scanf("%d",S.top-);
  108. }
  109. printf("\n存入数据成功!!\n");
  110. return OK;
  111. }
  112.  
  113. //清空栈
  114. int clear(SqStack &S){
  115. S.top=S.base;
  116. printf("栈清空成功!!\n");
  117. // creatlist(S);
  118. return OK;
  119. }
  120. //打印栈中元素
  121. int pr(SqStack S){
  122. if(S.top==S.base){
  123. printf("\n\n栈为空!!");
  124. return ERROR;
  125. }
  126. int *p;
  127. p = S.top;
  128. printf("栈中元素有:\n");
  129. while(p>S.base) {
  130. p--;
  131. printf("\n%d",*p);
  132. }
  133. return OK;
  134. }
  135. //操作菜单
  136. void OperateMenu(){
  137.  
  138. printf("\n\n--------------请选择元素处理方式---------\n\n");
  139. printf("注:此程序为栈的实现,故只能对序列尾进行元素的插入和删除\n\n");
  140. printf("0> 退出\n\n");
  141. printf("1>: 栈尾插入元素\n\n");
  142. printf("2>: 删除栈尾元素\n\n");
  143. printf("3>: 打印元素\n\n");
  144. printf("4>: 获取栈顶元素(存入的最后一个元素)\n\n");
  145. printf("5>: 清空原栈\n\n");
  146. printf("6>:批量输入\n\n");
  147. printf("请选择对元素的处理:");
  148. }
  149. void main(){
  150. int w=,k,boo=,e=;
  151. SqStack S;
  152. printf("注:此测试过程输入值应全为数字\n\n");
  153. printf("请用户选择创建栈或退出程序:\n\n");
  154. printf("创建栈请输入:'1'\n\n");
  155. printf("退出请选择'0'或 其它!!\n\n");
  156. printf("请选择:");
  157. scanf("%d",&w);
  158. if(w==){
  159. InitStack(S);
  160. // creatlist(S);
  161. OperateMenu();
  162. scanf("%d",&k);
  163. while(k){
  164. switch(k){
  165. case :break;
  166. case :Push(S,e);
  167. break;
  168. case :Pop(S,e);
  169. break;
  170. case :boo=pr(S);
  171. if(boo)
  172. printf("\n\n打印成功!!");
  173. else
  174. printf("打印失败!!");
  175. break;
  176. case :boo=GetTop(S,e);
  177. if(boo)
  178. printf("\n\n获取成功!!");
  179. else
  180. printf("获取失败!!");
  181. break;
  182. case :clear(S);
  183. break;
  184. case :creatlist(S);break;
  185.  
  186. }
  187. OperateMenu();
  188. scanf("%d",&k);
  189. }
  190.  
  191. }
  192.  
  193. }

c_数据结构_栈的实现的更多相关文章

  1. C_数据结构_栈

    # include <stdio.h> # include <malloc.h> # include <stdlib.h> typedef struct Node ...

  2. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_04 数据结构_1_数据结构_栈

    2.1 数据结构有什么用? 当你用着java里面的容器类很爽的时候,你有没有想过,怎么ArrayList就像一个无限扩充的数组,也好像链表之类 的.好用吗?好用,这就是数据结构的用处,只不过你在不知不 ...

  3. C#数据结构_栈和队列

    栈:先进后出,只能在栈顶进行操作. 栈的操作主要包括在栈顶插入元素和删除元素.取栈顶元素和判断栈是否为空等. 栈的接口定义: public interface IStack<T> { in ...

  4. c_数据结构_图_邻接表

    课程设计------邻接表 图的遍历实现课程设计:https://files.cnblogs.com/files/Vera-y/图的遍历_课程设计.zip #include<stdio.h> ...

  5. C_数据结构_链表的链式实现

    传统的链表不能实现数据和链表的分离,一旦数据改变则链表就不能用了,就要重新开发. 如上说示:外层是Teacher,里面小的是node. #ifndef _MYLINKLIST_H_ #define _ ...

  6. c_数据结构_队的实现

    # 链式存储#include<stdio.h> #include<stdlib.h> #define STACK_INIT_SIZE 100//存储空间初始分配量 #defin ...

  7. c_数据结构_链表

    #include<stdio.h> #include<stdlib.h> #define ERROR 0 #define OK 1 #define OVERFLOW -2 ty ...

  8. c_数据结构_顺序表

    #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define LIST_INIT_SIZE 100 // 线性表存储空间的初始分配量 #define ...

  9. C_数据结构_走迷宫

    #include <stdio.h> #include <conio.h> #include <windows.h> #include <time.h> ...

随机推荐

  1. STM32F1-GPIO的操作

    GPIO 即通用输入输出口.凡事都要熟悉,熟能生巧.一定要掌握MDK软件的工程操作方法. 对于GPIO的操作. Project里面要有以下几个文件夹(开发之前需要包含相应的库文件,这里默认已经包含) ...

  2. 关于在Fragment中设置toolbar及菜单的方法

    在NoActionBar的主题中onCreateOptionsMenu方法不会运行,这里就需要将toolbar强制转换为ActionBar 在加入toolbar的监听之类后需要在onCreateVie ...

  3. jenkins每次构建前删除工作目录操作

    背景: 想在拉取代码前,删除代码,结果百度白天找到答案,mark下 需要安装Workspace Cleanup Plugin插件, 再看创建任务项,勾选即可实现

  4. 06 元祖 字典 集合set

    元组 定义: ti=() print(ti,type(ti)) 参数:for可以循环的对象(可迭代对象) t2=tuple(") # ('1', '2', '3') <class 't ...

  5. python第一天,编写用户接口

    作业:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 流程图: 代码 #!/usr/bin/env python #-*- coding:utf-8 -*- #created b ...

  6. PID控制器开发笔记之三:抗积分饱和PID控制器的实现

    积分作用的引入是为了消除系统的静差,提高控制精度.但是如果一个系统总是存在统一个方向的偏差,就可能无限累加而进而饱和,极大影响系统性能.抗积分饱和就是用以解决这一问题的方法之一.这一节我们就来实现抗积 ...

  7. 疯狂Workflow讲义——基于Activiti的工作流应用开 PDF 下载

    <疯狂Workflow讲义--基于Activiti的工作流应用开> 一:文档获取下载方式: 1:花20CSDN积分:可以下载:http://download.csdn.net/downlo ...

  8. Confluence 6 用自带的用户管理

    在一些特定的情况下,你可能希望禁用 Confluence 自带的用户管理或完全使用外部的用户目录进行用户管理.例如 Jira 软件或者 Jira Service Desk.你可以在 Confluenc ...

  9. 树形dp 入门

    今天学了树形dp,发现树形dp就是入门难一些,于是好心的我便立志要发一篇树形dp入门的博客了. 树形dp的概念什么的,相信大家都已经明白,这里就不再多说.直接上例题. 一.常规树形DP P1352 没 ...

  10. java多线程机制中的Thread和Runnable()区别

    1.java语言使用Thread类及其子类对象来表示线程,新建的一个线程声明周期中经历 新建.(声明一个线程,此时他已经有了相应的内存空间和其他资源),运行(线程创建之久就据用了运行的条件,一旦轮到使 ...