数据结构-栈的顺序结构两种方式
第一种结构:
存储空间有限,适用于知道存储长度的情况下。操作实现很简单。
1 #include "stdio.h" 2 3 4 #define MAXSIZE 50 5 #define STACKINCREMENT 10 6 #define OK 1 7 #define ERROR 0 8 typedef int SElemType; 9 typedef int Status; 10 11 typedef struct 12 { 13 SElemType data[MAXSIZE]; //存储数组 14 int top; //栈顶 15 }Stack; 16 17 //初始化栈 18 Status InitStack(Stack &S) 19 { 20 S.top = -1; //栈顶指向-1代表空栈 21 return OK; 22 } 23 24 //重置栈为空栈 25 Status ClearStack(Stack &S) 26 { 27 S.top = -1; //与初始化一样道理 28 return OK; 29 } 30 31 //判断栈是否为空,空栈返回OK 否则返回ERROR 32 Status StackEmpty(Stack S) 33 { 34 if(S.top < 0) 35 return OK; 36 else 37 return ERROR; 38 } 39 40 //返回栈的长度 41 int StackLength(Stack S) 42 { 43 return S.top+1; //因为top值是做数组下标所以比长度小一 44 } 45 46 //若栈不为空 用e返回栈顶数据 并返回OK 否则返回ERROR 47 Status GetTop(Stack S, SElemType &e) 48 { 49 if(StackEmpty(S)) 50 return ERROR; 51 e = S.data[S.top]; 52 return OK; 53 } 54 55 //若栈不为空 把e插入栈顶 并返回OK 否则返回ERROR 56 Status Push(Stack &S, SElemType e) 57 { 58 if(S.top >= MAXSIZE-1) 59 return ERROR; 60 S.top++; 61 S.data[S.top] = e; 62 return OK; 63 } 64 65 //若栈不为空 删除栈顶数据 并用e返回值 并返回OK 否则返回ERROR 66 Status Pop(Stack &S, SElemType &e) 67 { 68 if(StackEmpty(S)) 69 return ERROR; 70 if(StackEmpty(S)) 71 return ERROR; 72 e = S.data[S.top]; 73 S.top--; 74 return OK; 75 } 76 77 //遍历Visit()函数 78 Status StackTraverse(Stack S, void (* Visit)(SElemType e)) 79 { 80 for (int i = 0; i <= S.top; i++) 81 Visit(S.data[i]); 82 printf("\n"); 83 return OK; 84 } 85 86 //StackTraverse调用函数 87 //在这里为输出数据 88 void Visit(SElemType e) 89 { 90 printf("%d ", e); 91 }
因为数据是存储在数组之中,所以没有销毁栈的基本操作函数
第二种结构:
相比第一种结构这种方法可以在上限的存储时增加存储容量的大小,使用更加灵活。操作实现依旧简单。
1 #include "stdio.h" 2 #include "stdlib.h" 3 4 typedef int Status; //存储空间初始分配 5 typedef int SElemType; //存储空间分配增量 6 #define ERROR 0 7 #define OK 1 8 #define STACK_INIT_SIZE 100 9 #define STACKINCREMENT 10 10 11 typedef struct 12 { 13 SElemType * base; //在栈构造之前和销毁之后base的值为NULL 14 SElemType * top; //栈顶指针 15 int StackSize; //当前已分配的存储空间,以元素为单位 16 }Stack; 17 18 //构造一个空栈 19 Status InitStack (Stack &S) 20 { 21 S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); //分配基本空间 22 if(!S.base) //判断是否分配成功 23 return ERROR; 24 S.top = S.base; //指向栈顶 25 S.StackSize = STACKINCREMENT; //初始链表最大长度 26 return OK; 27 }//InitStack 28 29 //销毁一个栈 30 Status DestroyStack(Stack &S) 31 { 32 free(S.base); //收回空间 33 S.top = S.base = NULL; //栈顶和base均指向空 34 return OK; 35 } 36 37 //重置表为空表 38 Status ClearStack(Stack S) 39 { 40 S.top = S.base;//栈顶指向首位代表表空 41 return OK; 42 } 43 44 //若S为空栈返回OK 否则返回ERROR 45 Status StackEmpty(Stack S) 46 { 47 if (S.top == S.base) 48 return OK; 49 else 50 return ERROR; 51 } 52 53 //返回栈的长度 54 int StackLength(Stack S) 55 { 56 SElemType * p = S.base; 57 int i = 0; //计数值为表长 58 while(p != S.top) 59 { 60 p++; 61 i++; 62 } 63 return i; 64 } 65 66 //若栈不空则用e返回栈顶数据并返回OK否则返回ERROR 67 Status GetTop(Stack S, SElemType &e) 68 { 69 if (StackLength(S) == 0) //空栈 70 return ERROR; 71 e = *S.top; 72 return OK; 73 } 74 75 //插入新的栈顶数据 76 Status Push(Stack &S, SElemType e) 77 { 78 if(S.top - S.base >=S.StackSize) //空间不足 79 { 80 S.base = (SElemType *)realloc(S.base, (S.StackSize + STACKINCREMENT) * sizeof(SElemType)); 81 if(!S.base) 82 return ERROR; 83 S.top = S.base + S.StackSize; 84 S.StackSize += STACKINCREMENT; 85 } 86 S.top++; 87 *S.top = e; 88 return OK; 89 } 90 91 //若栈不空 则删除栈顶数据并用e返回且返回OK 否则返回ERROR 92 Status Pop(Stack &S, SElemType &e) 93 { 94 if(StackLength(S) == 0) //空栈 95 return ERROR; 96 e = *S.top; 97 S.top--; 98 return OK; 99 } 100 101 //对栈遍历Visit()函数 102 Status StackTraverse(Stack S, void (*Visit)(SElemType e)) 103 { 104 SElemType * p = S.base; 105 while(p != S.top) 106 Visit(*++p); 107 printf("\n"); 108 return OK; 109 } 110 111 //StackTraverse调用函数 112 //在这里做输出栈表用 113 //顺序为栈底到栈顶 114 void Visit(SElemType e) 115 { 116 printf("%d ",e); 117 }
栈是限定仅在表尾进行插入和删除的操作线性表,因此栈的实现比较线性表显得更简单且容易实现。
参考《数据结构(C语言版)》严蔚敏编著
转载于:https://www.cnblogs.com/ABook/p/5371792.html
数据结构-栈的顺序结构两种方式相关推荐
- 【url传参】之 获取url?后面的参数,对应参数名获取值 和 全量获取转换为对象结构两种方式
访问你挚爱的强哥_百度搜索https://www.baidu.com/s?wd=%E4%BD%A0%E6%8C%9A%E7%88%B1%E7%9A%84%E5%BC%BA%E5%93%A5&r ...
- 判断顺序栈栈满的两种方式
判断顺序栈栈满的两种方式
- Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除(CRUD)
Java版数据结构之单向链表 CRUD Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除; 留了一个疑问; 我的代码仓库:https://github.com/zhuangbinan ...
- 顺序栈—栈顶指针的两种初始化
采用顺序存储的栈称之为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针指示当前栈顶元素的位置. 下面给出两种栈顶指针定义的方式,讨论两种方式中在出栈.入栈代码上的不同: ...
- plsql导出表结构到excel_plsql 将表结构导出到excel中的两种方式
1.情景展示 如何将表结构导出到excel中(不是建表的SQL语句),如何实现? 2.方式一 新建一个SQL窗口,输入要导出结构的表,选中右键-->描述 右键-->导出-->CSV文 ...
- windbg-获取结构体大小(常用的两种方式)
两种方式: dt -v:详细输出.这会输出结构的总大小和字段数量这样的附加信息.当它和-y选项一起使用时,所有的符号都会被显示出来,即使他们没有任何关联的类型信息. [cpp] view plainc ...
- Mysql复制表两种方式(复制表结构、复制表结构和数据、复制表中的部分数据、复制表中的部分数据并起别名)
需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等. 如果仅仅使用CREATE TABLE - SELECT 命令,是无法实现的. 本章节将为大家介绍如何完整的复制MySQL数据表,步骤如 ...
- MySQL入门--显示表结构的两种方式
显示表的字段名,字段数据类型,字段约束情况,存储引擎,默认字符编码集,有以下两种方式. 方式1 SHOW COLUMNS FROM <表名>;= DESC <表名>; 方式2 ...
- Eclipse安装SVN插件的两种方式
登录 | 注册 收藏成功 确定 收藏失败,请重新收藏 确定 查看所有私信查看所有通知 暂没有新通知 想要绕过微信小程序开发中的坑吗?不妨来听这个,今晚8点,1小时帮你搞定! 23小时以前 CSDN日报 ...
最新文章
- linux进行主机发现,linux – 网络上所有计算机的主机名发现
- “评IDC,送免费主机”活动,主机无任何限制,无广告
- Oracle 10.2.0.4和10.2.0.5 中 OEM bug 8350262
- (C/C++学习)6.数组指针和指针数组
- java注意的一些细节问题
- 程序员训练机器学习 SVM算法分享
- 华硕 固件 Linux内核,ubuntu 64位编译华硕AC1200G+固件
- 领域驱动设计最佳实践
- 【转】winIO的解释与使用
- 21. Window moveTo() 方法
- 反激变换器matlab仿真变压器demo,反激变换器建模Matlab仿真
- activerecord java_GitHub - redraiment/jactiverecord: 实现自己的ORM还是有价值的
- 在html中图片不显示不出来,网页图片显示不出来
- Xilinx FPGA的DNA是什么?
- node处理图片和PDF文件方法
- 必备单品,FSearch
- markman psd
- 枪火——古龙之视觉化
- 中国证监会计算机专业考试试题,中国证监会计算机专业考试大纲
- word文档中的页码怎么从正文开始
热门文章
- C#学习Error问题:“System.NullReferenceException:未将对象引用设置到对象的实例”
- 超像素SLIC算法源码阅读
- 视觉SLAM总结——视觉SLAM十四讲笔记整理
- 单样本学习与孪生网络
- 【星球知识卡片】图像生成都有哪些核心技术,如何对其进行长期深入学习
- 【GAN优化】从动力学视角看GAN是一种什么感觉?
- 全球及中国高速公路行业运营管理模式与经营效益分析报告2022版
- 今天俺要说一说工厂方法模式(Factory)
- Git中.gitignore文件的使用
- 注入技术--消息hook注入