1. 栈的概念

在开始前,请牢记这句话:栈是一种先进后出的数据结构。

栈(stack)是限定仅在表的一端进行操作的数据结构,请联系我们前文所学的,设想一个单链表我们只能够对其链表的表尾结点进行操作,而操作也只能够进行插入一个新的结点与删除最末尾的这个结点两个操作,而这样强限制性的‘链表’,就是我们所说的栈。

让我们重新理顺一下定义:栈是一个线性的数据结构,规定这个数据结构只允许在其中一端进行操作,并禁止直接访问除这一端以外的数据。

如图:栈就像一个放球的单管桶,只允许球从桶的开口这一端取出,并且球先放入桶中则后从桶中拿出。

2. 栈的结点设计

栈分为数组栈和链表栈,其区别是数组栈使用数组进行功能的模拟,实现较为快速和便利,而链表栈使用链表的思路去设计,实现较为麻烦,但是其稳定不易出错;在链表栈中又分为静态链表栈和动态链表栈,静态链表栈给定栈的空间大小,不允许超过存储超过给定数据大小的元素,而动态栈使用的是自动创建空间的方法进行创建,只要符合机器的硬件要求以及编译器的控制,其理论上是极大的。

说了那么多,我们以链表栈的动态链表栈为例子,进行栈的设计,在后文直接以栈一名字称呼动态链表栈,这也是各类语言标准模板中栈的实现方式。

首先是栈的结点设计,我们可以设计出两个结构体,一个结构体Node表示结点,其中包含有一个data域和next指针。

其中data表示数据,其可以是简单的类型(如int,double等等),也可以是复杂的结构体(struct类型);

next指针表示,下一个的指针,其指向下一个结点,通过next指针将各个结点链接。

目前的设计如同单链表,接下来,为这个进行限制性的设计,我们额外添加一个结构体,其包括了一个永远指向栈头的指针top和一个计数器count记录元素个数,(也可以设计成一个指针top和一个指针bottom分别指向栈头和栈尾)其主要功效就是设定允许操作元素的指针以及确定栈何时为空(count的方法是当count为0时为空,top和bottom方法就是两者指向同一个空间时为栈为空)

这里我采用的是top和count组合的方法。其代码可以表示为://栈的结点设计

//单个结点设计,数据和下一个指针

typedef struct node

{

int data;

struct node *next;

} Node;

//利用上面的结点创建栈,分为指向头结点的top指针和计数用的count

typedef struct stack

{

Node *top;

int count;

} Link_Stack;

3. 栈的基本操作—入栈

如图:

入栈(push)操作时,我们只需要找到top所指向的空间,创建一个新的结点,将新的结点的next指针指向我们的top指针指向的空间,再将top指针转移,指向新的结点,即是入栈操作

其代码可以表示为://入栈 push

Link_Stack *Push_stack(Link_Stack *p, int elem)

{

if (p == NULL)

return NULL;

Node *temp;

temp=(Node*)malloc(sizeof(Node));

//temp = new Node;

temp->data = elem;

temp->next = p->top;

p->top = temp;

p->count++;

return p;

}

C语言实现STL静态链表,先进后出的数据结构-栈 一相关推荐

  1. 先进后出的数据结构-栈 一

    1. 栈的概念 在开始前,请牢记这句话:栈是一种先进后出的数据结构. 栈(stack)是限定仅在表的一端进行操作的数据结构,请联系我们前文所学的,设想一个单链表我们只能够对其链表的表尾结点进行操作,而 ...

  2. c语言 静态链表插入排序,数据结构C语言版 表插入排序

    西门豹治邺奇计 数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P2 ...

  3. c语言将一个已知头结点的单链表逆序_C语言实现常用数据结构:静态链表数组实现(第5篇)...

    「今天是学习C语言第 148 天」 纸上学来终觉浅,绝知此事要躬行.-- 陆游「冬夜读书示子聿」 # 静态链表 使用数组实现,利用数组下标代替指针,从而实现数据结点之间的先后关系.实现要点: 1.数组 ...

  4. c语言动态存储分配和链表,C语言静态链表和动态链表

    1. 静态链表 结构体中的成员可以是各种类型的指针变量,当一个结构体中有一个或多个成员的基类型是本结构体类型时,则称这种结构体为"引用自身的结构体".如: struct link ...

  5. java静态链表_静态链表及其创建(C语言实现)

    <顺序表和链表优缺点>一节,我们了解了两种存储结构各自的特点,那么,是否存在一种存储结构,可以融合顺序表和链表各自的优点,从而既能快速访问元素,又能快速增加或删除数据元素. 静态链表,也是 ...

  6. 遗落在时光里的静态链表(线性表的静态存储)---C语言版

    目录 静态链表的定义 静态链表的操作 初始化 求表长 分配空间 回收空间 插入操作 删除操作 其他操作 完整源代码 总结一下 众所周知,指针是c语言的灵魂,指针使得链表的实现简单明了起来. 但是问题来 ...

  7. Scratch 与C语言实现数据结构静态链表的建立及操作

    Scratch 实现数据结构静态链表的建立及操作 scratch操作 Scratch 实现数据结构静态链表的建立及操作 数据结构 初始化静态链表 添加数据代码 删除数据 回收空闲节点操作代码 计算静态 ...

  8. 程序设计C语言-静态链表及指针

    程序设计C语言的学习笔记,静态链表的指针实现 struct Student {int num;float score;struct Student *next; }; struct Student s ...

  9. java静态链表_数据结构笔记:静态链表(C语言)

    void CreateList(StaticLinkList *P)//创建一个静态链表 { int i; for(i=0;i此时并没有已占用空间,所以第一个节点中的指针(cur)的值为1,也就是说空 ...

最新文章

  1. Intel 6系列芯片组设计缺陷 全球出货暂停
  2. 我敢打赌!你见过的所有程序员都是这样的!!!
  3. [Nova] Failed to get shared write lock Is another process using the image?
  4. a1708硬盘转接口_2015年A1502 Macbook Pro更换硬盘
  5. ubuntu下安装jdk、tomcat、mysql
  6. CF1253E Antenna Coverage
  7. 【学习笔记】左偏树的可持久化(【模板】k短路 / [SDOI2010]魔法猪学院)
  8. ExtJs CheckboxSelectionModel 全选操作后 清空表格头的checkBox
  9. [2005/05/03] 卡耐基选语
  10. AspxGridView 主子表设置
  11. python 对excel操作用法详解_Python对excel文档的操作方法详解
  12. 软件集成测试工作流程指南
  13. docker部署达梦流程记录(DM7和DM8)
  14. Junit单元测试——如何正确测试异常
  15. # RPGMaker MV 基础 1 : 项目目录认识
  16. Android 跟 ios 测试有什么区别
  17. html渐变编织背景,CSS hover背景/文字渐变效果
  18. 解决docker+openvpn搭建完成后客户端能连接,但是无法访问互联网或其他机器
  19. 调用百度云短语音合成简单程序
  20. 沧海一声笑计算机版本,各个版本的《沧海一声笑》,古韵十足

热门文章

  1. Juniper SRX防火墙默认用户名和密码
  2. 【汇智学堂】-JS菜鸟版过河小游戏(之二---测试父母上船)
  3. 计算机网络系统维护和管理,计算机网络系统维护和管理技术.doc
  4. exported android,Android activity exported属性理解
  5. 千万级分拣平台API安全治理实战
  6. 【整理】IT人怎么学人际沟通
  7. ios开发 阅读器APP 的开发
  8. python文件打包成可执行文件exe的两种方法
  9. Matlab实现正态分布
  10. 基于C#的PhotoS图片分享网站设计