数据结构之栈的实现

数据结构——栈 一、 以char数据类型作为栈中的数据类型 要求:实现栈的内存分配、回收栈、判断栈空/满、清空栈、计算栈的长度、入栈、出栈操作、遍历栈中的所有元素 入栈的数据类型为char类型(实际上栈作为一种机制是没有数据类型上的界限的) 语言实现:C++ main.cpp //要求如下 /* 栈类 要求: MyStack(int size); //分配内存初始化空间,设定栈容量,栈... 阅读详情

百度百科:栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。


前言:以下代码仅供参考。若你也在学数据结构,那么你可以参考我的学习方法:
1.理解对应数据结构
2.准备纸和笔,在纸上把对应操作的实现,用图画的形式推演一篇。
3.打开IDE,依据第二步的思路,编写代码。
4.测试代码
5.对照书本实现。

栈的抽象数据类型

来源《大话数据结构》

ADT Stack(栈)
Data
	同线性表。元素具有相同的类型,相邻的元素具有前驱和后驱关系。

Operation:
	InitStack(*S);初始化操作,建立一个空栈
	DestroyStack(*S);若栈存在,销毁
	ClearStack(*S);若存在,清空
	StackEmpty(*S);若空栈返回true,否则false
	GetTop(*S, *e);若存在,获得栈顶元素
	Push(*S, e);若存在,入栈
	Pop(*S, *e);若存在,出栈
	StackLength(S);若存在,返回元素个数.

EndADT

栈的顺序存储结构实现——C语言描述

栈的定义:

typedef struct 
{
	int data[MAXSIZE];
	int top;
}Stack;

Operation: 初始化栈空间

//初始化栈空间
bool InitStack(Stack* s)
{
	s->data[MAXSIZE - 1] = { 0 };
	s->top = -1;
	
	return OK;
}

Operation: 入栈

//push,入栈操作
int Push(Stack* s, int e)
{
	//判断栈空间是否满了
	if (s->top == MAXSIZE - 1 || !s)
		return ERR;

	s->data[++s->top] = e;

	return OK;
}

Operation: 弹栈

//pop,弹栈操作
int Pop(Stack* s, int* e)
{
	//判断栈是否为空,或不存在
	if (s->top == -1 || !s)
		return ERR;

	*e = s->data[s->top--];

	return OK;
}

Operation: 销毁

//若栈存在,销毁
int DestroyStack(Stack* s)
{
	if (!s)
		return ERR;

	free(s);
	s = NULL;

	return OK;
}

Operation: 清空栈

//清空栈
bool ClearStack(Stack* s)
{
	if (!s || s->top == -1)
		return ERR;

	s->data[MAXSIZE - 1] = { 0 };
	s->top = -1;

	return OK;
}

Operation: 获取栈顶元素

//获取栈顶元素
int GetTopElem(Stack* s, int *e)
{
	if (!s || s->top == -1)
		return ERR;

	*e = s->data[s->top];

	return OK;
}

Operation: 返回栈的元素个数

//返回栈的元素个数
int StackLength(Stack* s, int* length)
{
	if (!s)
		return ERR;
	
	*length = s->top + 1;

	return OK;
}

顺序存储结构的双栈共享空间

栈的长度是固化的,是定义栈时就必须指定的。这势必造成一定栈空间得不到有效利用。例如如果一个栈能够容纳4K,而我们经常用的只是前2K,这就造成了后2K的利用率低下,而有效栈空间的内存是及其有限的且十分重要的,比如内核栈空间。因此栈空间的利用率从栈底往后延伸利用率不断降低。
为了解决这个问题也是为了提高栈空间的利用率,因此出现了同一个栈空间两个栈顶指针,分居栈空间两端。

栈的定义:

typedef struct
{
	int data[MAXSIZE];
	int topLeft;
	int topRight;
}Stack;

Operation: 初始化栈空间

bool InitStack(Stack* s)
{
	if (!s)
		return ERR;

	s->data[MAXSIZE - 1] = { 0 };
	s->topLeft = -1;
	s->topLeft = MAXSIZE - 1;

	return OK;
}

Operation: 入栈

int Push(Stack* s, int e, int StackNum)
{
	//判断栈空间是否满了,或为空
	if (s->topLeft + 1 == s->topRight || !s)
		return ERR;

	if (StackNum == 1)
	{
		s->data[++s->topLeft] = e;
	}
	else if (StackNum == 2)
	{
		s->data[--s->topRight] = e;
	}
	else
	{
		return ERR;
	}
	

	return OK;
}

Operation: 弹栈

int Pop(Stack* s, int* e, int StackNum)
{
	//判断栈是否为不存在
	if (!s)
		return ERR;

	if (StackNum == 1 && s->topLeft != -1)
	{
		*e = s->data[s->topLeft--];
	}
	else if (StackNum == 2 && s->topRight != MAXSIZE)
	{
		*e = s->data[s->topRight++];
	}
	else
	{
		return ERR;
	}
	

	return OK;
}

Operation: 销毁

//若栈存在,销毁
int DestroyStack(Stack* s)
{
	if (!s)
		return ERR;

	free(s);
	s = NULL;

	return OK;
}

Operation: 清空栈

//清空栈
bool ClearStack(Stack* s)
{
	if (!s)
		return ERR;

	s->data[MAXSIZE - 1] = { 0 };
	s->topLeft = -1;
	s->topRight = MAXSIZE;

	return OK;
}

Operation: 获取栈顶元素

int GetTopElem(Stack* s, int* e, int StackNum)
{
	if (!s)
		return ERR;

	if (StackNum == 1 && s->topLeft != -1)
	{
		*e = s->data[s->topLeft];
	}
	else if (StackNum == 2 && s->topRight != MAXSIZE)
	{
		*e = s->data[s->topRight];
	}
	else
	{
		return ERR;
	}

	return OK;
}

栈的链式存储结构——C语言描述

此时解决了顺序存储结构长度固化的缺点,并且栈的长度将不受限制。

栈的定义:

#define MAXSIZE 100
#define OK 1
#define ERR 0

typedef struct SNode
{
	int val;
	struct SNode* next;
}StackNode;

typedef struct LinkStack
{
	StackNode* top;
	int count;
} LinkStack, *LinkStackPtr;

Operation: 初始化栈空间

//初始化
bool InitLinkStack(LinkStack* s)
{
	if (!s)
		return ERR;

	s->top = NULL;
	s->count = 0;
	
	return OK;
}

Operation: 入栈

int Push(LinkStack* s, int e)
{
	//因链表结构通常动态变化,没有长度限制,因此没有基于链表栈,栈满这一说
	if (!s)
		return ERR;

	StackNode* p = (StackNode*)malloc(sizeof(StackNode));
	if (!p)
		return ERR;
	memset(p, 0, sizeof(StackNode));

	p->val = e;
	p->next = s->top;
	s->top = p;
	s->count++;

	return OK;
}

Operation: 弹栈

int Pop(LinkStack* s, int* e)
{
	if (!s || !s->top)
		return ERR;

	StackNode* p = s->top;
	*e = s->top->val;
	s->top = s->top->next;
	s->count--;
	free(p);
	p = NULL;

	return OK;
}

Operation: 销毁

//若栈存在,销毁
int DestroyLinkStack(LinkStack* s)	//
{
	if (!s)
		return OK;

	while (s->top)
	{
		StackNode* p = s->top;
		s->top = s->top->next;
		free(p);
		p = NULL;
	}

	free(s);
	s = NULL;

	return OK;
}

Operation: 清空栈

//清空栈
int ClearLinkStack(LinkStack* s)
{
	if (!s)
		return OK;

	while (s->top)
	{
		StackNode* p = s->top;
		s->top = s->top->next;
		free(p);
	}
	s->count = 0;

	return OK;
}

Operation: 获取栈顶元素

int GetTop(LinkStack* s, int* e)
{
	if (!s)
		return ERR;

	*e = s->top->val;

	return OK;
}


Operation 判断是否为空

bool IsStackEmpty(LinkStack* s)
{
	return (!s->top || !s) ? OK : ERR;
}

Operation 返回元素个数

int StackLength(LinkStack* s)
{
	return s->count;
}

声明:代码是本人敲的,除非表明出处。
参考:《大话数据结构》

若依开源框架(分离版)在人大金仓数据库下使用 对于甲方业务特殊要求,使用国产化数据库人大金仓,作为项目主要存储。这里以若依开源框架整合人大金仓为例,演示如何在真实项目中引入人大金仓。 阅读详情

相关推荐

从零开始掌握RDMA拥塞控制:原理、算法与实战解析

本文深入解析了RDMA拥塞控制的核心原理与实战配置。RDMA依赖无损网络保障高性能,其关键在于PFC与ECN两大技术协同防止丢包。文章重点剖析了主流算法DCQCN的工作机制与参数调优,并简要介绍了HPCC与TIMELY等前沿算法。最后提供了在Linux上配置RoCEv2与DCQCN的详细步骤及性能调试方法,帮助读者从零构建稳定的RDMA网络环境。

weixin_28452161的博客 137

数据结构栈的实现及经典OJ一道

栈的实现要注意以下几点:栈的的特点是先进后出栈的实现方式可以用数组、链表栈的功能有push、pop、top、size、empty、destory你以为到这里就结束了吗?开玩笑,看我标题,来用我们写的栈做一道题吧!!

aaa1336的博客 491

TC3xx芯片SPI多从机通信避坑指南:AUTOSAR框架下的DMA配置与片选切换

本文针对英飞凌TC3xx芯片在AUTOSAR框架下实现SPI多从机通信的实战难题,提供了详尽的避坑指南。重点解析了如何利用硬件支持的16路片选(SLSO)灵活切换,在AUTOSAR中正确配置不同时序的从设备,并深入探讨了异步模式下DMA的启用条件与关键配置细节,帮助开发者规避通信失败风险,提升系统可靠性。

nn3456的博客 153

数据结构---栈的实现

一、栈 学习栈之前我们需要认识栈究竟是什么东西。 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的删除操作叫做出栈。出数据也在栈顶 图解↓: 图中数据都是从栈顶进入,当图中1,2,3,4都进入,先出栈的只能是4,但也可以边进边出,举例:所以不一定出栈顺序就是4 3 2 1..

shijinghe的博客 3508

STM32实现薄膜压力传感器数据采集(标准库和HAL库实现)

薄膜压力传感器采集压力数据

XiaoCaiDaYong的博客 3万+

VNC Viewer建立多个图形界面,来远程访问同一个服务器(Ubuntu)

如题。目前已经有了一个VNC viewer连接,那么如果再开一个图形界面呢? 思路主要是:新建一个用户,从这个用户新建一个vnc连接,然后访问图形界面。

the Blog of 等不到天亮丶等时光 5901

PHP实现数据结构栈

数据结构之-栈[数组实现] 定义: 在表尾进行插入和删除操作的线性表 特性 后进先出,元素先进栈的会最后出来 没有元素的栈为空栈 栈有栈顶和栈底区分,栈顶的元素是最后进栈的元素,栈底是最先进栈的元素 元素从栈里出来,叫做出栈,弹栈[pop] 元素进入栈里,叫做入栈,压栈,进栈[push] 如图所示: 在PHP中,数据结构没有明显的区分,一个数据几乎就涵盖了所有...

LiYi 417

C# OpenCvSharp4实战:5分钟搞定工业视觉模板匹配(附完整代码)

本文为C#开发者提供了基于OpenCvSharp4的工业视觉模板匹配实战指南。通过详细的环境搭建、核心原理解析和完整代码示例,重点介绍了如何使用`matchTemplate`函数,特别是`CCoeffNormed`方法,快速实现高精度、抗光照变化的模板匹配,并分享了多目标匹配、图像预处理等工业级优化技巧。

weixin_29053067的博客 503

【数据结构】栈实现队列 & 队列实现栈

🏷️力扣地址:🌈232. 用栈实现队列请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作 实现 类:示例1: 💫关键思路:1️⃣pop接口🌠动图解析:👇🏻2️⃣peek接口🌠动图解析:👇🏻3️⃣push接口🌠动图解析:👇🏻4️⃣empty接口💡代码实现: 🏷️力扣地址:🌈225. 用队列实现栈请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(、、 和 )。实现 类:示例1 🌍解题关键:💫关键思路:那到底是如何实......

qq_42996461的博客 1838

LEAP模型—低排放分析平台

LEAP 正在迅速成为进行综合资源规划、温室气体 (GHG) 缓解评估和低排放发展战略 (LEDS) 的国家的事实标准,尤其是在发展中国家,许多国家也选择使用 LEAP 作为其承诺的一部分向联合国气候变化框架公约(UNFCCC)报告。至少有 32 个国家使用 LEAP 来创建能源和排放情景,这些情景是其国家自主气候变化贡献计划 (INDC) 的基础:具有历史意义的巴黎气候协议的基础旨在表明各国开始经济脱碳的意图和投资于气候适应力。

weixin_54697010的博客 3281

统计学习导论(ISLR) 第四章分类算法课后习题

统计学习导论(ISLR) 参考资料: The Elements of Statistical Learning An Introduction to Statistical Learning 统计学习导论(ISLR)(二):统计学习概述 统计学习导论(ISLR)(三):线性回归 统计学习导论(ISLR)(四):分类 ISLR统计学习导论之R语言应用(二):R语言基础 ISLR统计学习导论之R语言应用(三):线性回归R语言代码实战 ISLR统计学习导论之R语言应用(四):分类算法R语言代码实战 统计学习导论

阿里云专家博主、数据科学领域优质创作者、统计er在读 2万+

【数据结构】栈的实现

【数据结构】栈如何实现

m0_59292239的博客 1288

YOLOv12改进策略【独家融合改进】| MobileNetV4+BiFPN,轻松实现降参涨点,适用专栏内所有的骨干替换

可扩展的高效物体检测BiFPN(加权双向特征金字塔网络)

Limiiiing的博客 980

数据结构中实现栈

数据结构中实现栈 需要实现的方法 package cn.dataStructure2.com; public interface Stack { // 将 item 压入栈中 void push(int item); // 返回栈顶元素,并且出栈 int pop(); // 返回栈顶元素,但不出栈 int peek(); // 判断...

weixin_44007988的博客 133

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

数据结构-使用链表实现栈

目录结构 Stack接口 package LinkedListStack; public interface Stack<E> { int getSize(); boolean isEmpty(); void push(E e); //向栈中添加元素 E pop();//向栈中取出元素 E peek();//查看栈顶的元素 } ...

我是太阳 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

数据结构——栈的实现

文章目录栈栈的概念及结构栈的实现 栈 栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out,也就是后进献先出)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的删除操作叫做出栈。出数据也在栈顶。 栈的实现 栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的 代价比较小。 如果选择单链

aaaaaaaWoLan的博客 344

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【C++】数据结构 栈的实现

本文以学生的视角学习C++数据结构的栈的实现,本文全程通俗易懂。

就业知识博客 821

【数据结构】之链栈的java实现

前言 最近参加一些校招,博主被问了很多数据结构的问题,其中很多问题面试官需要的答案不仅仅是需要你了解这些概念,而是需要你通过某种语言(C、C++、Java)把这种结构实现,同时还能根据公司的具体需求进一步优化。对于博主这样,数据结构功底薄弱的选手,最终结果只能“被面”。痛定思痛,现在痛苦狂补中。江湖中有句话“欠下的债终究要还的”。 链栈 栈的链式存储结构称为链栈。 在算法中要用到多个栈时,

博学而笃志,切问而近思 7179

数据结构——栈的模拟实现

与顺序表和单链表不同的是:顺序表和单链表都可以在头部和尾部插入和删除数据,但是栈的结构就锁死了(栈的底部是堵死的)栈只能从栈顶插入(数据入栈)和删除(数据出栈)数据————last in first out(后进先出)(最后入栈的数据要第一个出栈如果进栈过程中不允许出栈:入栈 1 2 3 4————出栈4 3 2 1。

2403_88695928的博客 1272

Java数据结构-栈的实现

一步到位,把栈实现了

算法萌新一枚 1823

数据结构之链栈实现

文章目录数据结构之链栈实现代码及思想测试截图 数据结构之链栈实现 代码及思想 #include <iostream> #include <cstdio> #include <cstdlib> using namespace std; #define ElemType int #define Status int #define OK 1 #define ERR...

李霁明的博客 619
上一篇: 数据结构之队列实现
下一篇: 双端队列思想解析
Cheney辰星
博客等级 码龄7年 4粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值