【线性表】栈:线性栈、动态线性栈、链式栈的基本特性

408_第二章_线性表 阅读详情

栈(stack)是一种运算受限的线性表。其受限是指进行插入和删除操作仅仅发生在该线性表的尾部。


Table of Contents

线性栈

动态线性栈

链式栈


线性栈

栈的定义:

  1. 是一种只能在一端(一般是尾部)进行插入和删除操作的特殊线性表。
  2. 按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶;需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
  3. 栈也称为后进先出(List In First Out)的线性表,简称LIFO结构。
  4. 它是一个线性表,也即,栈元素具有线性关系,即前驱后继关系。
  5. 只不过它是一种特殊的线性表而已,进行插入和删除操作的只能在称为栈顶(top)的一端进行。另一端为栈底(bottom)。

什么是线性栈:

  1. 用一组地址连续的存储单元(即数组)依次存放栈底到栈顶的数据元素,栈底位置固定不变,栈顶位置随着入栈和出栈操作而变化。
  2. 线性栈的理解:立起来的数组,操作都在数组的最后元素位进行

线性栈的代码定义

#define MAXSIZE 100
typedef struct
{
	int data[MAXSIZE];
	int top;
}SeqStack;

特性:

  1. 栈中元素个数为零时称为空栈。
  2. 栈的插入操作,一般称为进栈(PUSH),也称压栈、入栈。删除则称为出栈(POP),也称弹栈。

  1. 它的特殊之处在于限制了这个线性表的插入和删除的位置,它始终只在栈顶进行。这也就使得:栈底是固定的,最先进栈的只能在栈底。
  2. 例如,递归时需要用到栈来记录断点;在浏览器的前进后退页也是利用栈来存储读取每个网页信息。

第一个线性栈

第一个线性栈
#include <stdio.h>
#define MAX 100

typedef struct
{
	int data[MAX];
	int top;
}stack;

int main()
{
	stack MyStack;

	//初始化栈
	MyStack.data[MAX] = 0;
	MyStack.top = -1;

	//进栈操作
	MyStack.data[++MyStack.top] = 100;  //栈顶指针往上移
	MyStack.data[++MyStack.top] = 200;

	//取数据
	printf("栈顶元素为:%d\n", MyStack.data[MyStack.top]);

	//出栈操作
	MyStack.top--;
	printf("栈顶元素为:%d\n", MyStack.data[MyStack.top]);

	return 0;
}

动态线性栈

为什么要引入动态线性栈?

  1. 在C语言中的数组要求在编译时必须确定数组的大小。
  2. 在利用数组做为线性栈的实现时,也会遇到数组容量不可以动态拓展的问题。
  3. 可以利用动态分配内存解决这个问题,即动态一维数组。

什么是动态线性栈?

  1. 动态的一维数组 + 栈的思想
  2. 动态申请一块内存,将栈中元素放入其中。当元素个数超过设定的最大长度时,可以在再动态申请更大的内存来存放元素。
  3. 通过动态内存申请返回的指针来以数组的形式访问栈中元素。

如何实现动态线性栈?

  • 使用malloc函数申请内存,使用realloc函数扩大内存;

第一个动态线性栈

#include <stdio.h>
#include  <stdlib.h>
#include  <assert.h>

typedef struct
{
	int* data;
	int top;
}stack;

int main()
{
	int size = 5;
	stack* MyStack = (stack*)malloc(sizeof(stack)); //为结构体分配内存
	assert(MyStack);
	
	//初始化
	MyStack->data = (int*)malloc(sizeof(int) * size); //为动态线性栈分配内存
	assert(MyStack->data != NULL);
	MyStack->top = -1;

	//压栈
	MyStack->data[++MyStack->top] = 100;
	MyStack->data[++MyStack->top] = 200;
	MyStack->data[++MyStack->top] = 300;

	//出栈
	MyStack->top--;
	printf("栈顶元素为:%d\n", MyStack->data[MyStack->top]);

	//重新分配大小
	size *= 2;
	MyStack->data = (int*)realloc(MyStack->data, size); //重新分配内存
	assert(MyStack->data != NULL); //注意,这将可能会导致原始的MyStack->data块内存泄露;这里仅作为演示,实际开发时慎用!

	MyStack->data[++MyStack->top] = 400;
	printf("栈顶元素为:%d\n", MyStack->data[MyStack->top]);
	return 0;
}


链式栈

什么是链式栈:

  1. 链式栈 = 单链表 + 栈的思想
  2. 链式栈的本质:倒立竖着的单链表!
  3. 每次入栈一个元素,向链表中添加一个节点(相当于头插法),出栈一个元素,释放一个节点。

链式栈的本质就是一个“竖着”的链表!

特性:

  1. 利用单链表的头插法,可以避免每次在链表的尾部进行插入和删除,就要遍历整个链表来找到尾节点。
  2. 在头部进行插入和删除时,只需根据头指针即可找到链表的首元素结点。而无需遍历链表。所以链式栈的出,入栈通过对链表进行头删和头插来实现。
  3. 单链表中常用的的头结点也就失去了意义,不再需要头结点的。

链式栈的代码定义

typedef struct node
{
	int data;
	struct node* next;
}StackNode;

第一个链式栈

#include <stdio.h>
#include  <stdlib.h>
#include  <assert.h>

typedef struct node
{
	int data;
	struct node* next;
}stack;

int main()
{
	stack* top = NULL; //设置一个栈顶指针,方便出栈、取栈操作
	stack* bottom = (stack*)malloc(sizeof(stack));
	assert(bottom != NULL);
	bottom->data = 100;
	bottom->next = NULL;
	top = bottom;

	stack* NodeAa = (stack*)malloc(sizeof(stack));
	assert(NodeAa != NULL);
	NodeAa->data = 200;
	NodeAa->next = bottom; //插入到bottom节点的前面,即头插法
	top = NodeAa;

	stack* NodeBb = (stack*)malloc(sizeof(stack));
	assert(NodeBb != NULL);
	NodeBb->data = 300;
	NodeBb->next = NodeAa;
	top = NodeBb;

	printf("栈顶元素:%d\n", top->data);

	//出栈
	stack* t = top;
	top = top->next;
	free(t);
	printf("栈顶元素:%d\n", top->data);
	return 0;
}

数据结构线性表笔记 ①相同数据类型的数据元素;②有限;③序列。线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表。若用L命名线性表,则其一般表示为La1a2aiamanLa1​a2​,,ai​am​,,an​式中,a1是唯一的“第一个”数据元素,又称表头元素;a是唯一的“最后一个”数据元素,又称表尾元素。除第一个元素外,每个元素有且仅有一个直接前驱。 阅读详情

相关推荐

数据结构源码之线性栈

数据结构源码C语言描述续,本篇描述了顺序栈的结构,读者可以直接下载并运行应用

线性结构——栈(c语言)

线性结构——栈(c语言)

在校生 840

数据结构之线性栈和队列

自己写的 数据结构之线性栈和队列 与同路的新手分享

数据结构与算法之美【6】-栈

栈是一种操作受限的线性表,只允许从栈顶插入和删除数据,所以每次删除的元素都是最后进栈的元素,故栈也被称为后进先出(LIFO)表。栈主要包含两个操作,入栈(也叫做压栈)和出栈,即在栈顶插入数据和从栈顶删除数据。 实际上,栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈。 关于时间复杂度,因为在出栈只需要移动一个变量存储空间,所以它的时间复杂度为O(1),但是对于入栈分两种情况: (1)栈空间固定不变 此时若空间不满,则直接入栈,如空间满,则丢..

王木木 718

Unity AR开发实战:从Vuforia图片识别到实体识别全流程解析

增强现实(AR)技术通过计算机视觉算法将虚拟信息叠加到现实世界,其核心原理在于对现实环境的感知与理解。在移动端AR开发中,图像识别与物体识别是实现虚实融合的关键技术,它们决定了虚拟内容能否准确、稳定地与现实对象对齐。Vuforia作为成熟的商业AR SDK,为开发者提供了从平面图像识别(Image Target)到三维实体识别(Model Target)的完整解决方案,极大降低了计算机视觉技术的应用门槛。在工程实践中,Vuforia通过封装复杂的特征提取与匹配算法,使开发者能够专注于交互设计与内容制作,广泛

weixin_30972263的博客 301

Qt图表库三选一:Qwt、QChart、QCustomPlot实战性能对比与避坑指南

本文深入对比了Qt开发中三大主流图表库Qwt、QChart和QCustomPlot的性能与适用场景。通过实测数据展示各库在渲染效率、内存占用和功能特性上的差异,并提供针对不同项目需求的选型建议和集成避坑指南,帮助开发者高效选择最适合的Qt图表解决方案。

weixin_33691700的博客 449

【数据结构】顺序栈和链栈--Stack

栈是一种线性数据结构,它的元素按照特定的顺序进行插入和删除操作。栈的插入操作称为入栈(push),删除操作称为出栈(pop)。栈可以看作是一种具有限制访问的线性表,只能在表的一端进行插入和删除操作,称为栈顶(top), 而另一端则称为栈底(bottom)。栈是计算机科学中非常重要的数据结构,它具有简单且高效的特点。我们深入了解了栈的概念、用途、基本操作和实现细节。通过掌握栈的原理和应用,我们可以更好地理解和使用它,从而在解决实际问题时发挥其优势。

Z1tai的博客 2863

深度学习batch、batch_size、epoch、iteration以及小样本中episode、support set、query set关系

训练整个数据集是epoch、把数据集分为多少小块就是batch,每个小块(batch)多少个数据就是batch_size,整个数据集需要训练多少轮是iteration

qq_42740834的博客 1610

基本数据结构——线性结构(栈)

1.什么是线性结构 线性结构是一种有序数据项的集合,其中每个数据项都有唯一的前驱和后继(除了第一个没有前驱,最后一个没有后继)。新的数据项加入到数据集中时,只会加入到原有某个数据项之前或之后。具有这种性质的数据集,就称为线性结构。 不同线性结构的关键区别在于数据项增减的方式。有的结构只允许数据项从一端添加,而有的机构则允许数据项从两端移除。 2.从4个最简单但功能强大的结构入手,开始研究数据结构(栈Stack、队列Queue、双端队列DQeque、列表List) 2.1 栈 2.1.1 什么是栈? 一种有次

weixin_38324954的博客 1345

【Tessent Shell Users Manual】【Ch3】Design Introspection and Editing(未完待续)

Tessent Shell 提供了一系列用于检查(examining/introspecting)和编辑design的命令。

Tranquil_ovo的博客 1731

嵌入式软考必备知识点:嵌入式系统开发中的重要概念和示例代码

在嵌入式软考中,有一些重要的知识点需要掌握,包括嵌入式系统的基本概念、编程语言、实时操作系统和硬件接口等。实时操作系统是一种专门设计用于嵌入式系统的操作系统,可以提供对任务调度、中断处理和资源管理等方面的支持。GPIO(通用输入输出):GPIO是嵌入式系统中常用的硬件接口,用于连接外部设备和嵌入式系统。以上是嵌入式软考中的一些必备知识点,包括嵌入式系统的基本概念、编程语言、实时操作系统和硬件接口。通过配置串口的波特率、数据位数和校验位等参数,可以实现与其他设备的可靠通信。一、嵌入式系统的基本概念。

PixeGO的博客 313

【数据结构】顺序栈和链栈的基本操作(定义,初始化, 入栈,出栈,取栈顶元素,遍历,置空)

详细讲解顺序栈和链栈的初始化,入栈,出栈,取栈顶元素,遍历,置空等操作

小吉妙妙屋 1万+

Vulkan入门系列3 - 绘制三角形代码解析(全)

【代码】Vulkan入门系列3 - 绘制三角形完整代码(带详细注释)

GPU全栈博主 1033

数据结构:线性表的顺序存储与链式存储

文章目录一、线性表的基本概念二、动态数组(顺序表)的实现与测试 一、线性表的基本概念 线性表:线性表是零个或者多个数据元素的有限序列,是最常用且最简单的一种数据结构。 特点: (1)存在惟一的一个被称做“第一个”的数据元素。 (2)存在惟一的一个被称做“最后一个”的数据元素。 (3)除第一之外,集合中每个元素均只有一个前驱。 (4)除最后一个之外,集合中每个数据元素均只有一个后继。 数学语言来定义...

Rain的博客 1万+

麒麟操作系统提示“默认密钥环已上锁”的解决办法

麒麟操作系统提示“默认密钥环已上锁”的解决办法

太极淘的博客 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

数据结构-线性表的链式存储(包含代码实现)

线性表的链式表示和实现 链式存储结构 结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻 线性表的链式存储结构又称为非顺序映像或链式映像。 用一组物理位置任意的存储单元来存放线性表的数据元素 这组存储单元既可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的。 链表中元素的逻辑次序和物理次序不一定相同 与链式存储结构相关的术语 1、结点:数据元素的存储映像。由数据域和指针域两部分组成 数据域:存放元素数值数据 指针域:存放直接后继结点的存储位置 2、链表:n个结点

qq_46338854的博客 9678

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

数据结构——线性表

线性表是一种逻辑结构 基本概念 线性表的存储:顺序存储,链式存储(单链表,双链表,循环链表,静态链表),顺序表与链表比较,存储结构选择 串:基本概念,存储结构,模式匹配,KMP 队列:顺序队列,循环队列,链式队列,双端队列 栈:基本概念(卡特兰数),栈的存储结构(顺序栈,链栈),栈的应用,表达式的表示与计算 矩阵和广义表:数组,矩阵存储(对称矩阵,三角矩阵,三对角矩阵),稀疏矩阵(十字链表,三元组存储),广义表

努力,奋斗! 6602

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据结构线性表

文章目录二、线性表2.1、线性表的定义和特点2.2、案例引入2.3、线性表的类型定义2.4、线性表的顺序表示和实现2.4.1、线性表的顺序表示2.4.2、顺序表中基本操作的实现2.5、线性表的链式表示和实现2.5.1、单链表的定义和表示2.5.2、单链表基本操作的实现2.5.3、循环链表2.5.4、双向链表2.6、顺序表和链表的比较2.7、线性表的应用2.8、案例分析与实现第二章小结第二章习题   二、线性表 伪码书上讲的也很详细,笔记中就不再打了。 2.1、线性表的定义和特点 由n (n≥0)个

chongyang_的博客 3万+

数据结构之线性表栈队列

数据结构之线性表栈队列、实现方式和顺序表示、栈和队列的共同点和不同点

kuangfeng的博客 2502

线性表的详解

线性表是算法题命题的重点。这类算法题实现起来比较容易且代码量较少,但是要求具有最优的性能(时间复杂度、空间复杂度),才能获得满分。因此,应牢固掌握线性表的各种基本操作(基于两种存储结构),在平时的学习中多注重培养动手能力。另外,需要提醒的是,算法最重要的是思想!考场上的时间紧迫,在试卷上不一定要求代码具有实际的可执行性,因此应尽力表达出算法的思想和步骤,而不必过于拘泥每个细节。注意算法题只能用C/C++语言实现。

gongjunbox的博客 1万+

数据结构之线性表,栈和队列

因此,为了表示每个数据元素ai与其直接后继元素ai+1之间的逻辑关系,对数据ai来说,除了存储其本身的信息之外,还需要存储一个指示其直接后继的信息(即直接后继的存储位置)。只要确定好了存储线性表的起始位置,线性表中任一数据元素都可以随机存取,所以线性表的顺序存储结构是一种随机存取的储存结构,我们通常用动态内存开辟的方法来开辟顺序表内存。采用顺序存储时,逻辑上相邻的元素,对应的物理存储位置也相邻。而采用链式存储时,逻辑上相邻的元素,物理存储位置则不一定相邻,对应的逻辑关系是通过指针链接来表示的。

2301_79407040的博客 1422

04 线性结构——栈(特性、进栈与出栈、栈顶指针、顺序栈和链式栈、相关功能的定义与代码实现)

本文全面介绍了栈的基本概念、相关概念、存储结构以及功能实现。首先,详细阐述了栈的定义、栈顶、栈底、空栈、栈的序列以及出栈入栈与栈顶指针移动的关系。接着,探讨了栈在函数调用中的应用,并介绍了栈的两种存储结构:顺序栈和链式栈,包括头插法和尾插法。最后,本文详细定义了栈的各种功能,如初始化栈、返回栈内元素个数、添加新元素至栈顶、弹出栈顶元素并返回、释放栈内存以及遍历栈中的所有元素,并提供了完整的代码实现。

大模型全栈工程师 · Thanks_ks 5035

栈、共享栈、链式栈(C++实现)

栈是一种线性表。不过它只能在一端进行插入和删除操作,先入栈的数据只能后出来,而后入栈的数据只能先出来。

Edison's 小宇宙 1万+

线性表、链表、栈和队列的初始化

线性表:具有相同特性数据元素的一个有限序列 存储结构:顺序存储(顺序表)和链式存储(链表) 顺序表可以随机访问,存储分配预先进行,一旦分配好在操作过程中始终不变 链表不支持随机访问,支持动态空间的存储分配 顺序表做插入的时候要移动多个元素,链表中插入元素无需移动元素 下面时他们的初始化操作 #define maxsize 100 typedef struct { int data[maxsiz...

编程知识分享,主打前端 3万+

DS冲刺整理做题定理(二)线性表、栈、队列的套路

1.表中的元素具有逻辑上的顺序性,表中元素也有其先后次序~表中元素具有抽象性,即仅讨论元素间的逻辑关系,而不考虑元素究竟表示什么内容~2.王道版的基本操作(运算),传入方式均为引用类型“&”3.初始动态分配语句。

软工科班,擅长Matlab、C++、微信小程序开发 1065
上一篇: 【线性表】队列:顺序队列、顺序循环队列、链式队列的基本特性
下一篇: 【Java多线程】多线程之间是如何实现通信的?
ALGO阿狗
博客等级 码龄9年 64粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值