1. 栈的概念

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

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

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

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

2. 栈的结点设计

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

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

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

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

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

//栈的结点设计

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

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指针转移,指向新的结点,即是入栈操作

其代码可以表示为:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

//入栈 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;

}

先进后出的数据结构-栈 一相关推荐

  1. C语言实现STL静态链表,先进后出的数据结构-栈 一

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

  2. 数据结构-栈(先进后出表)

    //数据结构-栈(先进后出表) #include<stdio.h> #define MaxSize 100 typedef char ElemType; typedef struct { ...

  3. 怎么删除结构体数组中的一组数据_数据结构-栈

    数据结构-栈 1)栈的定义. 栈是只能通过访问它的一端来实数据存储和检索的一种线性数据结构,逻辑结构和线性表相同.特点在于运算有所限制:即主要特征是"后进先出"(先进后出). 在栈 ...

  4. JVM【带着问题去学习 02】数据结构栈+本地方法栈+虚拟机栈+JVM栈运行原理

    1.数据结构栈 栈是一种比较简单的数据结构,后进先出.栈本身是一个线性表,但是这个表中只有一端允许数据的进出.栈的常用操作包括入栈push和出栈pop,对应于数据的压入和弹出.由于栈后进先出的特性,常 ...

  5. java语言链栈_Java语言实现数据结构栈代码详解

    近来复习数据结构,自己动手实现了栈.栈是一种限制插入和删除只能在一个位置上的表.最基本的操作是进栈和出栈,因此,又被叫作"先进后出"表. 首先了解下栈的概念: 栈是限定仅在表头进行 ...

  6. java数据结栈空的条件表达式_数据结构——栈和队列例题

    1.若一个栈的输入序列为1,2,3,-,n,输出序列的第一个元素是i,则第j个输出元素是_____. 选项ABCD均错误,第j个输出元素应为i-j+1. 栈是一种先进后出的数据结构,也就是说如果入栈顺 ...

  7. C语言-数据结构-栈(静态栈与动态栈)

    一.简介 在哔哩哔哩看视频学的,赫斌老师数据结构入门的内容-b站搜索:av6159200(P33),通过学习,能独立把赫斌老师教的敲出来,由于动态栈(链表阉割版)的功能很少,我并没有增加什么其它功能, ...

  8. 数据结构栈的简单实现(JAVA)

    新的改变 栈是线性数据结构的一种,相当于一个箱子,如果向往箱子里放书,第一本书肯定是放入箱底,但是取出来的时候是从最上面开始取的,并拿不到最里面的东西,所以元素是先进后出的,栈最上面的元素为栈顶元素. ...

  9. 11.0、C语言数据结构——栈

    11.0.C语言数据结构--栈 栈的定义:         栈是一种重要的线性结构,可以这样讲,栈是前面讲过的线性表的一种具体形式:         官方定义:栈(stack)是一个 后进先出(Las ...

最新文章

  1. 默认的程序化等效项(类型)
  2. docker下的mysql my.ini_Docker + MySQL 主从环境搭建
  3. 用package.json配置NodeJS项目的模块声明
  4. 编译过程中,termcap.h 文件找不到路径 licli.a终于生成
  5. 手把手教你玩转网络编程模型之完成例程(Completion Routine)
  6. 深度学习基本概念笔记
  7. html填满剩余空间,html – 标题,两侧填充剩余空间
  8. left join效率为什么低_为什么自考的你学习效率特别低?对号入座
  9. GaiGai----1
  10. 在自定义HttpHandler中使用Session
  11. 如何用python做模型_python的模型如何使用?
  12. 单片机的各种存储的含义和区别
  13. scala apply是什么
  14. python拟合曲线求方程,曲线拟合方程python
  15. git difftool 使用 p4merge,DiffMerge 或者 Beyond Compare 4
  16. 使用visual studio2019在VB.net中用OPC读写数据
  17. dropbox 怎么使用_如何在一台PC上使用多个Dropbox帐户
  18. 2021年【机械员】通用基础及岗位技能-考试题库及答案(三)
  19. Leetcode 简单四 罗马数字转整数
  20. tabIndex 和 aria注意点

热门文章

  1. 全文搜索,迅搜(Xunsearch)使用心得
  2. 学英语最好的计算机美剧推荐,推荐四部经典的美剧!适合学习英语口语的美剧有哪些?...
  3. 小米4c信号显示无服务器,小米4c网速慢解决方法(小米4c卡顿严重)
  4. 互联网的战争--腾讯与360
  5. nodejs遍历一个目录下所有的文件
  6. 警方停止搜救卡迪夫城新援 英超宣布将为其默哀
  7. excel仪表盘_免费的Excel仪表板工具
  8. python仪表盘绘图_Python制作仪表盘图,比Excel快速N倍
  9. 目标跟踪“Siamese Instance Search for Tracking”
  10. 域管理:windows server分发与分配软件