【数据结构初阶(4)】栈的基本操作实现

news2024/11/19 3:21:58

文章目录

  • Ⅰ 概念及结构
    • 1. 栈的概念
    • 2. 栈的操作
  • Ⅱ 基本操作实现
    • 1. 栈的定义
    • 2. 初始化栈
    • 3. 元素入栈
    • 4. 元素出栈
    • 5. 获取栈顶元素
    • 6. 获取栈中有效元素个数
    • 7. 判断栈空
    • 8. 销毁栈

Ⅰ 概念及结构

1. 栈的概念

  • :栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作
  • 栈顶和栈底:进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出的原则
  • 空栈:不含任何元素的栈

2. 栈的操作

  • 入栈:在栈顶插入数据称为入栈 (压栈 / 进栈),入数据在栈顶
  • 出栈:在栈顶删除数据称为出栈 (弹栈),出数据在栈顶

在这里插入图片描述

Ⅱ 基本操作实现

1. 栈的定义

  • 栈一般用数组或链表来实现,使用数组栈在入栈上会更轻松,因此本文使用的为数组栈 (顺序栈)。

代码实现

// 支持动态增长的栈
typedef int STDataType;

typedef struct stack
{
	STDataType* data;	//栈空间
	int top;			//栈顶
	int capacity;		//容量 
}stack;

2. 初始化栈

实现方法

先将栈空间置空,栈顶置为 -1,栈空间容量置为 0。

  • 栈顶置为 -1,表示指向当前元素。因为本文使用的为数组栈,栈顶实际上是最后一个元素的下标,如果栈顶初始化为 0 的话,就没法很好的表示栈内是没有元素还是只有一个元素。

代码实现

// 初始化栈 
void StackInit(stack* ps)
{
	assert(ps);

	ps->data = NULL;	//栈空间置空
	ps->top = -1;		//栈顶
	ps->capacity = 0;	
}

3. 元素入栈

  • 栈顶指针 top 指向的是当前的元素,在插入新元素时需要先将栈顶指针 + 1,指向栈顶之上。

在这里插入图片描述

代码实现

// 入栈 
void StackPush(stack* ps, STDataType data)
{
	assert(ps);

	if (ps->top + 1 == ps->capacity)	//检查栈空间是否需要扩容
	{
		int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;

		STDataType* tmp = 
		(STDataType*)realloc(ps->data, sizeof(STDataType) * newcapacity);

		if (NULL == tmp)
		{
			perror("realloc");
			exit(-1);
		}

		ps->data = tmp;
		ps->capacity = newcapacity;
	}

	ps->top++;					//栈顶指针指向栈顶之上
	ps->data[ps->top] = data;	//元素入栈
}

4. 元素出栈

  • 若栈不为空,则直接将栈顶指针 - 1 即可,只有在栈顶指针维护下的元素才是有效数据。
// 出栈 
void StackPop(stack* ps)
{
	assert(ps);
	assert(ps->top > -1);	//栈不为空

	ps->top--;				//栈顶指针 - 1
}

5. 获取栈顶元素

  • 若栈不为空,则直接返回栈顶指针指向的那块空间的数据即可。
// 获取栈顶元素 
STDataType StackTop(stack* ps)
{
	assert(ps);
	assert(ps->top > -1);		//栈不为空

	return ps->data[ps->top];	//返回栈顶元素
}

6. 获取栈中有效元素个数

  • 因为栈顶指针实际表示的是数组下标,所以栈中有效数据的个数为 top+1。
// 获取栈中有效元素个数 
int StackSize(stack* ps)
{
	assert(ps);

	return ps->top + 1;
}

7. 判断栈空

  • 在初始化栈时将栈顶指针初始化为 -1表示栈空,可以直接用 -1 是否等于 top 来判断是否栈空。
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(stack* ps)
{
	assert(ps);

	return -1 == ps->top;	
}

8. 销毁栈

// 销毁栈 
void StackDestroy(stack* ps)
{
	assert(ps);

	free(ps->data);				//释放栈空间
	ps->data = NULL;
	ps->top = ps->capacity = 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1241740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

9.华为OD技术面手撕代码实录:旋转矩阵

旋转矩阵 给你一幅由 N N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。 示例 1: 给定 matrix = [[1,2,3],[4,5,6],[7,8,9] ],原地旋转输入矩阵,使其变为: [[7,4,1],[8,5,2],[9,6,3] ]示例 2: 给定 matrix = [[ 5, 1, 9,11],[ 2, 4…

中国智能汽车这一年,主打一个“卷”

文丨刘俊宏 “这才刚过去半年多,汽车行业又更新了一轮。”一位车评人在广州车展感叹道。 作为每年最后一个A级车展,广州车展向来被视为中国车市的“风向标”。相比上海车展“拥抱汽车行业新时代”、成都车展“驭见未来”的主题,广州车展“新…

CyberRT-共享内存实现

CyberRT共享内存类图 共享内存消息发布 数据用共享内存发布时,首先会创建ShmTransmitter对象,包含两个主要成员segment和notifier,Segment用于创建共享内存(上面绿色部分),Notifer 最终构建ReadableInfo通…

工会排队模式系统,打破传统创新消费

​小编介绍:10年专注商业模式设计及软件开发,擅长企业生态商业模式,商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地;扶持10余个电商平台做到营收过千万,数百个平台达到百万会员,欢迎咨询。 在…

ES ElasticSearch安装、可视化工具kibana安装

1、安装ES docker run -d --name es9200 -e "discovery.typesingle-node" -p 9200:9200 elasticsearch:7.12.1访问测试: http://域名:9200/ 2、安装kibana对es进行可视化操作 执行命令 docker run -d --name kibana5601 -p 5601:5601 kibana:7.1.12.修…

人工智能对我们的生活影响

目录 前言 一、人工智能的领域 二、人工智能的应用 三、对人工智能的看法 总结 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filotimo__✍️原创,首发于CSDN&#x1f4…

Python编写的爬虫为什么受欢迎?

每每回想起我当初学习python爬虫的经历,当初遇到的各种困难险阻至今都历历在目。即便当初道阻且长,穷且益坚,我也从来没有想过要放弃。今天我将以我个人经历,和大家聊一聊有关Python语音编写的爬虫的事情。谈一谈为什么最近几年py…

关于实时云渲染并发问题的分享,实时云渲染到底能不能省显卡?

近期遇到很多客户咨询实时云渲染技术中的并发问题,在这里点量小芹针对这个问题的几个常见疑惑进行集中的解答分享,希望对有迷惑的朋友有所启发和帮助。 第一个问题,实时云渲染能否扩展一张显卡支持的并发数? 实时云渲染是一个新兴…

IDEA中注释快捷键及模板

单行注释 将光标放置于要注释所在行,使用 Ctrl /, 添加行注释,再次使用,去掉行注释 若需要将多行进行单行注释,只需要选中要注释的多行,然后使用 Ctrl /, 添加行注释,再次使用&a…

PTA-成绩转换

本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则: 大于等于90分为A;小于90且大于等于80为B;小于80且大于等于70为C;小于70且大于等于60为D;小于60为E。 输入格式: 输入在一行中给出一个整数的百分制成…

【洛谷算法题】P5714-肥胖问题【入门2分支结构】

👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5714-肥胖问题【入门2分支结构】🌏题目描述🌏输入格式&a…

网络安全等级保护2.0国家标准

等级保护2.0标准体系主要标准如下:1.网络安全等级保护条例2.计算机信息系统安全保护等级划分准则3.网络安全等级保护实施指南4.网络安全等级保护定级指南5.网络安全等级保护基本要求6.网络安全等级保护设计技术要求7.网络安全等级保护测评要求8.网络安全等级保护测评…

10和一万能分销商城源码系统 源码全开源可二开 一个后台轻松管理所有设备 并附带完整的搭建教程

电子商务和移动商务的兴起,传统的实体销售已经无法满足市场的需求。为了适应这种趋势,小编来给大家分享一款10和一万能分销商城源码系统。这是一个全新的、具有高度可定制性的电子商务平台,其背后的逻辑是简化商家操作流程,提高销…

opencv-分水岭算法分割

原理 任何一副灰度图像都可以被看成拓扑平面,灰度值高的区域可以被看成是山峰,灰度值低的区域可以被看成是山谷。我们向每一个山谷中灌不同颜色的水。随着水的位的升高,不同山谷的水就会相遇汇合,为了防止不同山谷的水汇合&#x…

Sentinel 授权规则 (AuthorityRule)

Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 SpringbootDubboNacos 集成 Sentinel&…

如何在AppLink配置金蝶云星空预算使用单流程

上一篇有提到金蝶云星空如何通过AppLink平台配置销售订单操作,这次来演示下如何“保存预算使用单”、“调拨单定时自动审核”以及“预算使用单反审核后删除”操作。 根据请求数据保存预算使用单 当webhook接收到数据时触发流程 步骤1:根据webhook的请…

从根到叶:随机森林模型的深入探索

一、说明 在本综合指南中,我们将超越基础知识。当您盯着随机森林模型的文档时,您将不再对“节点杂质”、“加权分数”或“成本复杂性修剪”等术语感到不知所措。相反,我们将剖析每个参数,阐明其作用和影响。通过理论和 Python 实践…

Navicat 技术指引 | 适用于 GaussDB 的自动运行功能

Navicat Premium(16.2.8 Windows版或以上) 已支持对 GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结构同步、协同合作、数据迁移等),这…

机器学习/sklearn 笔记:K-means,kmeans++,MiniBatchKMeans

1 K-means介绍 1.0 方法介绍 KMeans算法通过尝试将样本分成n个方差相等的组来聚类,该算法要求指定群集的数量。它适用于大量样本,并已在许多不同领域的广泛应用领域中使用。KMeans算法将一组样本分成不相交的簇,每个簇由簇中样本的平均值描…