栈

栈(添加尾部元素、删除尾部元素、返回尾部元素、返回长度、判空) import 文件的地址 https://blog.youkuaiyun.com/qq_21944445/article/details/99705171 # coding:utf-8 from linklist import LinkList # 栈 class Stack(LinkList): def __init__(self): super().__init__() ... 阅读详情

1 基本概念

栈是限定仅在表尾进行插入或删除操作的线性表。表头称为栈底,表尾称为栈顶,不含元素的空栈叫做空栈。栈具有后进先出的特点。

2 抽象数据类型(ADT)

数据对象:{a1,a2,.....,an},每个元素类型为DataType,与线性表类似。

数据关系:除第一个元素外,每一个元素有且只有一个直接前驱元素;除最后一个元素外,每个元素有且只有一个直接后驱。一对一  的对应关系。第一个元素被称为栈底元素,最后一个元素为栈顶元素。

基本操作:

                    InitStack(*S): 建立一个空栈。

                   DestroyStack(*S): 若栈存在,则销毁它。

                   ClearStack(*S): 将栈清空。

                   StackEmpty(S): 若栈为空,返回true,否则返回false。

                   GetTop(S,*e): 若栈存在且非空,则返回栈顶元素值给e。

                   Push(*S,e): 插入e为栈顶元素。

                   Pop(*S,*e): 删除栈顶元素,并将值返回给e。

                   StackLength(S): 返回栈S的元素个数。

3 顺序存储:

#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
#include <stdlib.h>
#include <stdio.h> 
//栈的顺序存储结构定义
#define STACK_INIT_SIZE 100    //栈的初始存储空间容量 
#define STACKINCREMENT 10      //当栈满时,每次新增的存储空间增量 
typedef int ElemType;         //元素的数据类型根据实际情况而定,这里假设为int 
typedef struct Stack
{
	ElemType *base;          //栈底指针,始终指向栈底,当指向NULL时,则栈结构不存在 
	ElemType *top;           //栈顶指针,指向栈顶元素的下一个元素,当栈为空时,栈顶指针指向栈底 
	int stacksize;           //当前栈的存储空间容量 
}SqStack;

int InitStack(SqStack*S)         //初始化创建一个栈 
{
	if (!(S->base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType)))) return ERROR;  //申请存储空间 
	S->top=S->base;            //栈为空,栈顶指针指向栈底 
	S->stacksize=STACK_INIT_SIZE;  //当前栈的存储空间容量为初始存储空间 
	return OK;
}

int DestroyStack(SqStack*S)    //销毁栈 
{
	if (S->base) 
	{
		S->stacksize=0;
		free(S->base);      //释放栈的基地址 
		S->base=NULL;
		S->top=NULL; 
	}
	return OK;
}

int ClearStack(SqStack*S)    //清空栈 
{
	while(S->base!=S->top)
	{
		S->top--;
	}
	return OK;
}

int StackEmpty(SqStack S)   //验证栈是否为空 
{
	if (S.base==S.top) return TRUE;
	return FALSE; 
}

int GetTop(SqStack S,ElemType*e)   //得到栈顶元素 
{
	if (S.base==S.top) return ERROR;
	*e=*(S.top-1);
	return OK;
}

int Push(SqStack *S,ElemType e)   //将元素e压栈 
{
	if ((S->top-S->base)>=S->stacksize)  //若栈已满 
	{
		S->stacksize+=STACKINCREMENT;
		if (!(S->base=(ElemType*)realloc(S->base,S->stacksize*sizeof(ElemType)))) return ERROR;    //申请新的栈存储空间 
	}
	*(S->top)=e;
	S->top++;
	return OK;
}

int POP(SqStack *S,ElemType*e)  //将栈顶元素出栈,并将值返回给e 
{
	if (S->base==S->top) return ERROR;
	*e=*(--S->top);
	return OK;
}

int StackLength(SqStack S)  //返回栈的长度 
{
	return (S.top-S.base);
}

int main()   //验证
{
	SqStack S;
	int e,choice; 
	do{
		printf("输入操作: 1.返回栈长度 2.进栈 3.出栈 4.得到栈顶元素 5.验证栈是否为空 6.清空栈 7.创建栈 8.销毁栈\n");
		scanf("%d",&choice);
		switch (choice)
		{
			case 1:
			{
				e=StackLength(S);
				printf("%d\n",e);
				break;
			}
			case 2:
			{
				printf("输入进栈元素值\n");
				scanf("%d",&e);
				Push(&S,e);
				break;
			}
			case 3:
			{
				POP(&S,&e);
				printf("%d\n",e);
				break;
			}
			case 4:
			{
				GetTop(S,&e);
				printf("%d\n",e);
				break;
			}
			case 5:
			{
				printf("%d\n",StackEmpty(S));
				break;
			}
			case 6:
			{
				ClearStack(&S);
				break;
			}
			case 7:
			{
				InitStack(&S);
				break;
			}
			case 8:
			{
				DestroyStack(&S);
				break;
			}
		}
	}while(choice!=8); 
	return 0;
}

4 链式存储

#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
#include <stdlib.h>
#include <stdio.h> 
//栈的链式存储结构定义
typedef int ElemType;         //元素的数据类型根据实际情况而定,这里假设为int 
typedef struct Node
{
	ElemType data;
	struct Node*next;
}Node,*LinkStack;

int InitStack(LinkStack*S)
{
	(*S)=(Node*)malloc(sizeof(Node));      //头结点 
	if (!(*S)) return ERROR;
	(*S)->next=NULL;                        
	(*S)->data=0;                         //头结点数据域用来存储栈长度 
}

int Push(LinkStack *S,ElemType e)   //将元素e压栈 
{
	Node*p;
	p=(Node*)malloc(sizeof(Node));
	if (!p) return ERROR;
	p->data=e;
	p->next=(*S)->next;
	(*S)->next=p;
	(*S)->data++;
	return OK;
}

int POP(LinkStack *S,ElemType*e)  //将栈顶元素出栈,并将值返回给e 
{
	Node*p;
	p=(*S)->next;
	*e=p->data;
	(*S)->next=p->next;
	free(p);
	(*S)->data--;
	return OK;
}

int StackLength(LinkStack S)
{
	return S->data;
}


int main()
{
	LinkStack S;
	Node*p;
	int e,choice; 
	do{
		e=0;
		printf("输入操作: 0.退出 1.返回栈长度 2.进栈 3.出栈 4.初始化栈\n");
		scanf("%d",&choice);
		switch (choice)
		{
			case 1:
			{
				e=StackLength(S);
				printf("%d\n",e);
				break;
			}
			case 2:
			{
				printf("输入进栈元素值\n");
				scanf("%d",&e);
				Push(&S,e);
				break;
			}
			case 3:
			{
				POP(&S,&e);
				printf("%d\n",e);
				break;
			}
			case 4:
			{
				InitStack(&S);
				break;
			}
		}
		p=S->next;
		printf("[");
		while(p)
		{
			printf("%d ",p->data);
			p=p->next;
		}
		printf("]\n");
	}while(choice!=0); 
	return 0;
}

4 总结

对于顺序栈和链栈,它们时间复杂度都一样,均为O(1)。顺序栈存取更简单方便,但链栈对于顺序栈来说,其长度可无限制。因此在处理元素数量变化不大的情况下,使用顺序栈更方便,否则最好使用链栈。



  

                  



【数据结构(三)】栈(上)栈的定义&顺序栈 文章目录栈的定义栈的抽象数据类型栈的顺序存储结构顺序栈的进栈&出栈两栈共享 栈的定义 栈:一种限定仅在表尾进行插入和删除操作的线性表。 栈顶:线性表上被允许插入和删除的一端。(表尾) 栈底:线性表上不允许插入和删除的一端。(栈底是固定的,最先进栈的只能在栈底) LIFO:栈又称作后进先出的线性表,简称LIFO结构。 进栈:栈的插入操作,也叫入栈,压栈。 出栈:栈的删除操作,也叫弹栈。 多... 阅读详情

相关推荐

C语言实现栈的创建、压栈、出栈、返回栈顶元素

栈结构体 typedef struct node//定义栈结点类型 { int data; struct node * next; }Node; typedef struct myStack//定义栈结构 { int size; Node * top; }myStack; 创建栈 void createStack(myStack ** s)//创建栈 { if(*s != NULL)//预防译编程 { printf("指针不为空"); return; } *s = (mySt

weixin_49061985的博客 1876

数据结构 顺序栈的基本操作 C语言

复习过程回顾数据结构 /*顺序栈*/ #include&lt;stdio.h&gt; #define MaxSize 50 //定义栈中元素的最大个数 typedef int ElemType; typedef struct{ ElemType data[MaxSize]; int top; //栈顶指针,始终指向栈顶元素,初始化为-1 }SqStack; void Init...

cdwzl的博客 512

从流量到凭证:实战解析SMB协议中的NTLMv2/v1哈希提取与破解

本文详细解析了SMB协议中NTLMv2/v1哈希的提取与破解实战技巧。从流量捕获、哈希格式处理到Hashcat高效破解,提供了一套完整的操作指南。文章特别强调了NTLMv2和NTLMv1哈希的区别及处理要点,并分享了防护建议与检测方法,帮助安全人员提升渗透测试效率。

weixin_30642561的博客 116

数据结构第四章 栈与队列

栈与队列: 栈是限定仅在表尾进行插入和删除操作的线性表 队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表 栈 栈的定义 栈是限定仅在表尾进行插入和删除操作的线性表 我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈。栈是先进后出的线性表,简称LIFO结构。 栈的插入操作,叫做进栈,也称压栈、入栈。栈的删除操作,也叫出栈或者弹栈。 例如,我们有1,2,3三个数字依次进栈,那会有几种出栈次序呢? 第一种,1,2,3进,再3,2,1出,这是最简单的一种,出栈次序为3

郑哥哥の博客 930

Doris + Iceberg 实现高效数据湖分层:架构解析与最佳实践

本文深入解析了如何利用Doris与Iceberg构建高效的数据湖冷热分层架构。通过将高频访问的热数据存储在Doris中以实现毫秒级查询,同时将历史冷数据归档至低成本的Iceberg存储,该方案在保障查询性能的同时显著降低了总体拥有成本。文章详细阐述了从架构设计、自动化迁移到统一查询的最佳实践,为应对海量数据下的成本与性能平衡提供了实战指南。

weixin_29207533的博客 135

《双剑合璧:双 IMU 驱动的高精度 AHRS 实战宝典(基于 ROS2)》

本文系统阐述了基于双IMU的高精度姿态与航向参考系统(AHRS)设计与实现方法。文章首先分析了传统单IMU系统的局限性,提出通过双IMU冗余配置实现性能互补的方案。从硬件设计要点(包括IMU选型策略、电路降噪方法、PCB布局规范),到算法实现方案(互补滤波、卡尔曼滤波等融合算法),再到ROS2软件架构与调优策略,全方位展示了双IMU系统的技术实现路径。特别强调快速性与高精度平衡的方法,包括动态参数调整、双IMU权重优化等核心技巧。最后总结了硬件降噪、算法调优等实用心法。

bother3000的博客 2024

栈的 创建,入栈,出栈,清空栈,遍历栈 的实现

数据结构 的学习视频 https://www.bilibili.com/video/av6159200?from=search&seid=6709590585276522157 一 算法: 栈: 数据进出,类向箱子放东西和拿东西,先进后出,或者说后进先出。栈分为静态栈和动态栈两种,静态栈用数组实现, 动态栈用链表实现。算法 出栈 入栈(压栈),遍历,清空。 1.创建栈 ...

xinlongkun的博客 2万+

随机截距交叉滞后模型RI-CLPM:原理、Mplus实现与结果解读

纵向面板数据分析中,传统交叉滞后模型(CLPM)常被用于探索变量间的时序关系,但其估计结果可能混淆了个体间稳定差异与个体内短期波动,导致交叉滞后路径出现偏差。随机截距交叉滞后模型(RI-CLPM)通过引入随机截距因子,将个体特质层面的差异与个体内动态过程分离,从而提供更纯净的个体内效应估计。该模型在组织心理学、发展心理学、成瘾行为等研究领域迅速普及,并成为顶级期刊审稿时常见的稳健性检验要求。本文从原理出发,系统讲解RI-CLPM的模型构建、识别条件、Mplus实操代码、输出解读及常见陷阱,并结合协变量处理、

weixin_33525298的博客 275

Linux中的各种栈:进程栈 线程栈 内核栈 中断栈

Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈栈的作用1. 函数调用2. 多任务支持Linux 中有几种栈?各种栈的内存位置?1. 进程栈2. 线程栈3. 进程内核栈4. 中断栈 Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈 栈的作用 首先,栈 (stack) 是一种串列形式的数据结构。这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 top) 进行推入 (push) 和弹出 (pop) 操作。根据栈的特点,很容易的想到

BeginnerMind 4517

053、坏点校正(DPC)进阶:静态坏点标定与动态坏点检测算法对比

文章摘要: 本文深入探讨了图像传感器坏点校正(DPC)技术,重点对比静态坏点标定与动态坏点检测算法。作者结合真实案例,指出静态标定在高增益场景下的局限性,并详细解析动态检测的核心算法、参数调优及常见误检问题(如边缘/纹理干扰)。提出“静态为主+动态为辅”的混合方案,强调阈值需随增益、亮度和温度自适应调整。文末总结六条工程建议,包括避免固定阈值、优先使用中值替换、定期更新坏点表等,强调DPC是图像质量的基础防线,需结合传感器特性综合优化。

zzfmlxs的博客 263

《大数据最全面试题-Offer直通车》目录

做好这些不用担心试用期不通过:程序员入职新公司如何快速上手项目本人遇到大数据面试题和参考答案(超过1万字精华版)大数据面试英文自我介绍参考(万字长文)大数据运维应用场景面试题汇总及参考答案(持续更新)万字数据仓库面试题及参考答案数据仓库数据质量监控和处理方法最佳实践数据仓库建模方法万字详解Doris的3种数据模型详解和数据仓库每一层的模型选用大数据面试临阵磨枪不知看什么?看这份心理就有底了-大数据常用技术栈常见面试100道题最全Hive面试题2024年(2万字详解)Elasticsearch 面试题及参考答

大模型大数据攻城狮的专栏 2643

栈文档之共享栈

共享栈是顺序栈的变种。利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延申。

二木成林 7800

PCL 基于法线微分(DoN)的点云分割【2026最新版】

基于法线微分的分割。博客长期更新,本文最新更新时间为:2026年5月10日。

点云侠的博客 39万+

栈文档之链栈

采用链式存储的栈称为链栈。链栈的优点是便于多个栈共享存储空间和提高效率,且不存在栈满上溢的清空。通常采用单链表实现,并且规定所有操作都是在单链表的表头进行上的(因为头结点的 `next` 指针指向栈的栈顶结点)。

二木成林 8580

【网络与爬虫 53】Scrapy-Prometheus实战指南:打造企业级爬虫监控体系的终极解决方案

本文深入探讨Scrapy-Prometheus集成技术,通过费曼学习法从监控痛点出发,详细讲解如何在Scrapy爬虫中集成Prometheus指标收集系统。涵盖从基础配置到企业级监控体系的完整实战指南,帮助开发者构建可观测性强、可维护性高的分布式爬虫监控平台,实现爬虫性能的精准监控和智能告警。

熵数实验室 1584

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

转载请注明出处: https://yakir-yang.github.io/ 栈是什么?栈有什么作用?首先,栈 (stack) 是一种串列形式的 数据结构。这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 top) 进行 推入 (push) 和 弹出 (pop) 操作。

木易博客专栏 4万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

栈和栈帧

栈 堆栈(stack)又称为栈或堆叠,是计算机科学里最重要且最基础的数据结构之一,它按照FILO(First In Last Out,后进先出)的原则存储数据。 栈的相关概念: 栈顶和栈底:允许元素插入与删除的一端称为栈顶,另一端称为栈底。 压栈:栈的插入操作,叫做进栈,也称压栈、入栈。 弹栈:栈的删除操作,也叫做出栈。 下面是栈的示意图,从图中可以清楚的看到,不管是插入数据还是删除数据,都是...

Casuall的博客 4960

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Devexpress16.2.6破解工具

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

JVM之栈和栈帧

栈: 1、又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把  另一端称为栈底。其特性是先进后出。 2、栈是线程私有的,生命周期跟线程相同,当创建一个线程时,同时会创建一个栈,栈的大小和深度都是固定的。 3、方法参数列表中的变量,方法体中的基本数据类型的变量和引用数据类型的引用都存放在栈中,成员变量和对象本身不存放在栈中。运行时,成员...

点缀星空 1万+

栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈,Stack 没人要了!

如果我们想要拿到最下面的盘子,就必须把它上面的所有盘子都拿走,像这样的一个操作,我们称之为后进先出,也就是“Last In First Out”(简称 LIFO)——最后的一个进的,最先出去。:浏览器的后退按钮会把我们访问的 URL 压入一个栈中,每次我们访问一个新的页面,新的 URL 就压入了栈的顶部,当我们点了后退按钮,最新的那个 URL 就从栈中移除,之前的那个 URL 就被访问到了。的,所以反转一串字符很容易,按照正常的顺序把字符压入栈中,然后再弹出来就行了。把元素 3 压入栈中的时候,

sunyan5211314的博客 621

栈的介绍 什么是栈?

栈,存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈、出栈的说法。 栈是限制插入和删除只能在一个位置上进行的线性表。 线性表概念见:简单概括什么是线性结构和非线性结构_iamxiaobai_的博客-优快云博客 这里的“只能在一个位置上进行插入和删除”指的是栈顶,栈顶是会随着栈里面的数据元素的多少变化的,是动态变化的,一直指向栈的最上面一个数据元素。 既然有栈顶,那么就会有栈底,栈底的元素是不允许直接插入和删除的。 如图: .

fufufu_的博客 1万+

栈系列之 栈排序

使用一个辅助栈完成原始栈的排序:栈顶到栈底从大到小。

一个码农的前三十年 4099

C语言 栈(顺序栈、链栈、共享栈)

栈初始化、进栈、出栈等基本操作算法实现。以上就是顺序栈、链式栈和共享栈,本文仅仅简单介绍了栈的基本操作,而栈的运用十分灵活。

m0_73070900的博客 2765

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

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

Edison's 小宇宙 1万+

栈的操作(入栈、出栈)之二:链栈

栈操作原则 使用栈操作数据,必须遵循“先入后出”的原则; 栈操作之链栈 链栈是用链表实现栈的存储结构,链表头部作为栈顶,链表尾部为栈底(单链表); 入栈 写入数据时,实际是对链表做“头插”操作,空链表时,头指针head指向null;新进数据插入链表头部,头指针head指向当前链表头部;以此类推,这种操作即为入栈(压栈); 出栈 读出数据时,实际是删除当前链表的头部(首元节点),将头指针head...

weixin_44612435的博客 4062
上一篇: 线性表
下一篇: 队列
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值