首先栈是一个先进后出或者说后进先出的限制性数据结构,并且用代码实现有顺序表和线性表两种方式,我的代码采用了顺序结构存储的方式,即首先在内存中申请一块空间,通过top和base两指针的状态进行基本增删改查操作,另附实验报告并对代码有详细的解读,如有需要可以发邮件给我,邮箱在基本资料中(如邮件未及时回复请谅解)

本代码注重对于程序健壮性的解读,其中的一些条件判断是巩固程序健壮性的,而判断中的代码则是实现的核心代码

#include <iostream>
#include <stdlib.h>#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
#define TRUE 1
#define FALSE 0
#define ERROR -1typedef int SElemType;
typedef int Status;typedef struct{SElemType *base;SElemType *top;int stacksize;
}SqStack;using namespace std;void title();
Status InitStack(SqStack &S);//创建
Status DestroyStack(SqStack &S);//销毁
Status ClearStack(SqStack &S);//清空
Status StackEmpty(SqStack S);//判空
Status Stacklength(SqStack S);//长度
Status GetTop(SqStack S);//获取最头元素
Status Push(SqStack &S,SElemType e);//插入头元素
Status Pop(SqStack &S);//删除最头元素
Status StackTraverse(SqStack S);//元素遍历
Status CreatStack(SqStack &S,int len);//插入一组元素int main()
{title();int opt=0;cout<<"请输入操作序号:"<<endl;cin>>opt;SqStack S;S.base = NULL;int ads = 0;while(opt!=0){ads =  0;switch(opt){case 1:InitStack(S);break;case 2:DestroyStack(S);break;case 3:ClearStack(S);break;case 4:StackEmpty(S);break;case 5:if(S.base==NULL){cout<<"栈不存在!"<<endl;break;}ads = Stacklength(S);cout<<"栈的长度为:"<<ads<<endl;break;case 6:GetTop(S);break;case 7:if(S.base==NULL){cout<<"栈不存在!"<<endl;break;}int num;cout<<"请输入需要插入的数:"<<endl;cin>>num;Push(S,num);break;case 8:if(S.base==NULL){cout<<"栈不存在!"<<endl;break;}if(S.base==S.top){cout<<"为空表,无元素可以删除!"<<endl;break;}ads = Pop(S);cout<<"返回删除的元素是"<<ads<<endl;break;case 9:StackTraverse(S);break;case 10:{if(S.base==NULL){cout<<"栈不存在!"<<endl;break;}int hj=0;cout<<"请输入插入元素的个数:"<<endl;cin>>hj;CreatStack(S,hj);break;}case 11:ads = ten_two(S);break;default:cout<<"输入有误!"<<endl;}cout<<"*请输入操作序号:*"<<endl;cin>>opt;}return 0;
}void title(){cout<<"*********************************************"<<endl;cout<<"******    1.初始化为空栈               ******"<<endl;cout<<"******    2.销毁栈                     ******"<<endl;cout<<"******    3.将栈置空                   ******"<<endl;cout<<"******    4.判断栈是否为空栈           ******"<<endl;cout<<"******    5.返回栈的长度               ******"<<endl;cout<<"******    6.求栈顶元素                 ******"<<endl;cout<<"******    7.插入元素,使其成为栈顶元素 ******"<<endl;cout<<"******    8.删除栈顶元素,并返回其值   ******"<<endl;cout<<"******    9.输出栈内元素               ******"<<endl;cout<<"******    10.输入栈元素                ******"<<endl;cout<<"******    11.十进制转二进制            ******"<<endl;cout<<"******    0.退出                       ******"<<endl;cout<<"*********************************************"<<endl;
}Status InitStack(SqStack &S){if(S.base!=NULL){cout<<"栈已存在!"<<endl;return FALSE;}S.base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!S.base){cout<<"申请内存空间失败!"<<endl;exit(ERROR);}S.top = S.base;S.stacksize = STACK_INIT_SIZE;cout<<"创建栈成功!"<<endl;return TRUE;
}Status DestroyStack(SqStack &S){if(S.base==NULL){cout<<"栈不存在!"<<endl;return FALSE;}free(S.base);S.base = NULL;S.top = NULL;cout<<"清空栈成功!"<<endl;return TRUE;
}Status ClearStack(SqStack &S){if(S.base==NULL){cout<<"栈不存在!"<<endl;return FALSE;}S.top = S.base;cout<<"栈已经清空!"<<endl;return TRUE;
}Status StackEmpty(SqStack S){if(S.base==NULL){cout<<"栈不存在!"<<endl;return FALSE;}if(S.top==S.base){cout<<"这是一个空栈!"<<endl;}else{cout<<"栈中有元素!"<<endl;}return TRUE;
}Status Stacklength(SqStack S){int len=0;len = S.top-S.base;return len;
}Status GetTop(SqStack S){if(S.base==NULL){cout<<"栈不存在!"<<endl;return FALSE;}if(S.top==S.base){cout<<"这是一个空栈!"<<endl;return FALSE;}else{cout<<"栈顶元素为:"<<*(S.top-1)<<endl;}
}Status Push(SqStack &S,SElemType e){if(S.top-S.base>=S.stacksize){S.base = (SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));if(!S.base){cout<<"申请内存空间失败!"<<endl;exit(ERROR);}S.top = S.base + S.stacksize;S.stacksize = S.stacksize + STACKINCREMENT;}*S.top = e;S.top++;return TRUE;
}Status Pop(SqStack &S){int e = 0;e = *(S.top-1);S.top--;return e;
}Status StackTraverse(SqStack S){if(S.base==NULL){cout<<"栈不存在!"<<endl;return FALSE;}if(S.base==S.top){cout<<"这是一个空表"<<endl;}else{cout<<"栈内元素(由栈底到栈顶)为:"<<endl;while(S.top>S.base){cout<<*(S.base++)<<"  ";}cout<<endl;}return TRUE;
}Status CreatStack(SqStack &S,int len){int k = 1;if((S.top-S.base)+len-1>=S.stacksize){k = (len/STACKINCREMENT)+1;S.base = (SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT*k)*sizeof(SElemType));if(!S.base){cout<<"申请内存空间失败!"<<endl;exit(ERROR);}S.stacksize = S.stacksize + STACKINCREMENT*k;}cout<<"输入"<<len<<"个元素:";int num = 0;for(int i=1;i<=len;i++){cin>>num;*(S.top) = num;S.top++;}cout<<"插入元素成功!"<<endl;return TRUE;
}

C++ 数据结构之栈stack (henu.hjy)相关推荐

  1. 线性数据结构之栈(Stack)

    一.栈(Stack) 栈是一种用于存储数据的简单数据结构(与链表类似) , 栈的关键就是入栈的次序 , 比如我们在交作业的时候 , 最先交的永远都在最后面 , 而老师检查的时候是从最上面开始拿 , 所 ...

  2. Python数据结构实战—栈(Stack)

    文章目录 1.栈的性质(后进先出) 2.使用deque作为栈 3.使用双端队列实现Stack类 1.栈的性质(后进先出) s = [] #定义一个空数组装元素 s.append('https://ww ...

  3. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

  4. 【JavaSE与数据结构】栈与Stack类

    ⭐️前面的话⭐️ 本篇文章带大家认识Java集合--Stack,Stack就是栈的意思,是一种数据结构,又叫先进后出表,本文首先会介绍数据结构<栈>,了解清楚栈的特点与性质,然后会根据栈的 ...

  5. 数据结构:栈(Stack)

    数据结构:栈(Stack) 栈是一种数据结构,是一种只能在一端进行添加和删除,受限制的线性表.先进入的元素被压入栈顶,最后进入的元素在栈顶,又称LIFO(后进先出)线性表. 栈需要下面几种操作 入栈 ...

  6. 备战NOI 数据结构——栈与单调栈(stack) 以及后缀表达式

    栈 stack 引入 栈的概念 代码实现 定义和初始化(init) 入栈(push) 出栈(pop) 访问栈顶元素(query) 查询栈的元素个数(size) 判断是否为空(empty) 清空栈(cl ...

  7. 在java的实现栈的插入数据_Java实现数据结构栈stack和队列Queue

    回顾JDK提供的集合类 容器(集合)框架如下: 集合类存放于java.util包中.集合类存放的都是对象的引用,而非对象本身. 集合类型主要有3种:set(集).list(列表)和map(映射). C ...

  8. java 栈队列区别是什么意思_Java实现数据结构栈stack和队列Queue是什么?

    回顾JDK提供的集合类 容器(集合)框架如下: 集合类存放于java.util包中.集合类存放的都是对象的引用,而非对象本身. 集合类型主要有3种:set(集).list(列表)和map(映射). C ...

  9. 简单数据结构(队列 栈 树 堆 )

    基础知识 基本概念 程序 = 算法 + 数据结构数据结构是计算机存储.组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.通常情况下,精心选择的数据结构可以带来更高的运行或者存 ...

最新文章

  1. Python+selenium 自动化-模拟键盘输入、点击操作,如何查看所支持的全部键位名称
  2. Intel Realsense python 关于能否使用单个align对象去处理多个流 (对齐process)
  3. ASP.NET Core 中文文档 第三章 原理(13)管理应用程序状态
  4. rowid 对应mysql_请教一下相当于MySQL中Oracle的RowID
  5. 第四章 第四节 per_cpu
  6. 使用Python判断文件是否为PE文件
  7. android观察者模式例子,Android-Kotlin实现观察者模式的小案例
  8. python读取txt每一行-Python逐行读取txt文本,按符合分割词并逐行写入txt
  9. java比较两个时间年月份的大小
  10. Mysql8.0 15安装后怎么打开_最新最全mysql8.0.15安装配置及连接Navicat教程
  11. 美团架构师探秘Java生态系统,介绍JDK、JVM、JEP
  12. Windows Server 2016 安装IIS
  13. 使用 jom 代替 nmake
  14. 201903-1小中大
  15. 使用电脑热点和Fiddler对Android app进行抓包
  16. Nginx服务器---正向代理
  17. 关于linux移植碰到Resetting CPU ...的问题
  18. Python爬取房价
  19. 3、频域无芯片RFID标签原理
  20. libevent configure: error: openssl is a must but can not be found.error while loading shared librari

热门文章

  1. ***实战:教你轻松查看QQ空间加密后的好友图片
  2. 大象高端营销:家装电话营销细节和技巧
  3. 安卓恢复大师怎样恢复手机删除的照片
  4. python 导入pygame模块
  5. 网易视频云:基于Hadoop山寨Amazon S3
  6. 前端开发规范:JavaScript 规范
  7. 我的世界服务器地皮系统,我的世界服务器怎么创建地皮世界
  8. Linux Sheel中cd dir后直接显示dir下的所有文件
  9. 利用Python实现ARCGIS中栅格计算器的简单功能
  10. 求推荐微信可开发手持蓝牙打印设备