第一种结构:

  存储空间有限,适用于知道存储长度的情况下。操作实现很简单。

 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

数据结构-栈的顺序结构两种方式相关推荐

  1. 【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 ...

  2. 判断顺序栈栈满的两种方式

    判断顺序栈栈满的两种方式

  3. Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除(CRUD)

    Java版数据结构之单向链表 CRUD Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除; 留了一个疑问; 我的代码仓库:https://github.com/zhuangbinan ...

  4. 顺序栈—栈顶指针的两种初始化

    采用顺序存储的栈称之为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针指示当前栈顶元素的位置. 下面给出两种栈顶指针定义的方式,讨论两种方式中在出栈.入栈代码上的不同: ...

  5. plsql导出表结构到excel_plsql 将表结构导出到excel中的两种方式

    1.情景展示 如何将表结构导出到excel中(不是建表的SQL语句),如何实现? 2.方式一 新建一个SQL窗口,输入要导出结构的表,选中右键-->描述 右键-->导出-->CSV文 ...

  6. windbg-获取结构体大小(常用的两种方式)

    两种方式: dt -v:详细输出.这会输出结构的总大小和字段数量这样的附加信息.当它和-y选项一起使用时,所有的符号都会被显示出来,即使他们没有任何关联的类型信息. [cpp] view plainc ...

  7. Mysql复制表两种方式(复制表结构、复制表结构和数据、复制表中的部分数据、复制表中的部分数据并起别名)

    需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等. 如果仅仅使用CREATE TABLE - SELECT 命令,是无法实现的. 本章节将为大家介绍如何完整的复制MySQL数据表,步骤如 ...

  8. MySQL入门--显示表结构的两种方式

    显示表的字段名,字段数据类型,字段约束情况,存储引擎,默认字符编码集,有以下两种方式.  方式1 SHOW COLUMNS FROM <表名>;= DESC <表名>; 方式2 ...

  9. Eclipse安装SVN插件的两种方式

    登录 | 注册 收藏成功 确定 收藏失败,请重新收藏 确定 查看所有私信查看所有通知 暂没有新通知 想要绕过微信小程序开发中的坑吗?不妨来听这个,今晚8点,1小时帮你搞定! 23小时以前 CSDN日报 ...

最新文章

  1. linux进行主机发现,linux – 网络上所有计算机的主机名发现
  2. “评IDC,送免费主机”活动,主机无任何限制,无广告
  3. Oracle 10.2.0.4和10.2.0.5 中 OEM bug 8350262
  4. (C/C++学习)6.数组指针和指针数组
  5. java注意的一些细节问题
  6. 程序员训练机器学习 SVM算法分享
  7. 华硕 固件 Linux内核,ubuntu 64位编译华硕AC1200G+固件
  8. 领域驱动设计最佳实践
  9. 【转】winIO的解释与使用
  10. 21. Window moveTo() 方法
  11. 反激变换器matlab仿真变压器demo,反激变换器建模Matlab仿真
  12. activerecord java_GitHub - redraiment/jactiverecord: 实现自己的ORM还是有价值的
  13. 在html中图片不显示不出来,网页图片显示不出来
  14. Xilinx FPGA的DNA是什么?
  15. node处理图片和PDF文件方法
  16. 必备单品,FSearch
  17. markman psd
  18. 枪火——古龙之视觉化
  19. 中国证监会计算机专业考试试题,中国证监会计算机专业考试大纲
  20. word文档中的页码怎么从正文开始

热门文章

  1. C#学习Error问题:“System.NullReferenceException:未将对象引用设置到对象的实例”
  2. 超像素SLIC算法源码阅读
  3. 视觉SLAM总结——视觉SLAM十四讲笔记整理
  4. 单样本学习与孪生网络
  5. 【星球知识卡片】图像生成都有哪些核心技术,如何对其进行长期深入学习
  6. 【GAN优化】从动力学视角看GAN是一种什么感觉?
  7. 全球及中国高速公路行业运营管理模式与经营效益分析报告2022版
  8. 今天俺要说一说工厂方法模式(Factory)
  9. Git中.gitignore文件的使用
  10. 注入技术--消息hook注入