[C语言 数据结构] 栈

1.什么是栈?

:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

出栈:栈的删除操作叫做出栈。出数据也在栈顶。

我们可以把它看作一个像桶,我们放东西进去一定在桶的顶端,而我们直接拿出桶中的东西也是从顶端拿取。、

2.栈的实现

(声明:C语言的数据结构就是手搓呗,虽然效率低了一点,但是强烈建议大家一起搓一遍,能很好的帮大家理解数据结构的同时,对动态内存管理,指针的理解都有好处)

简单认识了一下栈之后呢我们开始着手实现栈的功能:

栈的实现一般可以使用数组或者链表实现,链表相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。(链表不用移动元素,程序的时间复杂度会大大降低)

好了,接下来大家就看着这个头文件搓起来吧。

// 下面是定长的静态栈的结构,实际中一般不实用,所以我们主要实现下面的支持动态增长的栈
/*
typedef int STDataType;
#define N 10
typedef struct Stack
{STDataType _a[N];int _top; // 栈顶
}Stack;
*/
// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{STDataType* _a;int _top; // 栈顶int _capacity; // 容量
}Stack;
// 初始化栈
void StackInit(Stack* ps); 
// 入栈
void StackPush(Stack* ps, STDataType data); 
// 出栈
void StackPop(Stack* ps); 
// 获取栈顶元素
STDataType StackTop(Stack* ps); 
// 获取栈中有效元素个数
int StackSize(Stack* ps); 
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps); 
// 销毁栈
void StackDestroy(Stack* ps); 

以下是我写的,大家可以用作参考

#define  _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"
void StackInit(Stack* ps)
{assert(ps);ps->_a = NULL;ps->_capacity = 0;ps->_top = 0;
}
// 入栈
void StackPush(Stack* ps, STDataType data) {assert(ps);//判断是否扩容if (ps->_capacity == ps->_top) {int newCapacity = ps->_capacity == 0 ? 4 : ps->_capacity * 2;Stack* tmp = (Stack*)realloc(ps->_a, sizeof(Stack) * newCapacity);assert(tmp);ps->_a = tmp;}//加上新数据ps->_a[ps->_top] = data;ps->_top++;
}
// 出栈
void StackPop(Stack* ps) {assert(ps);assert(ps->_top);ps->_top--;
}
// 获取栈顶元素
STDataType StackTop(Stack* ps) {assert(ps);assert(ps->_top);return ps->_a[ps->_top-1];
}
// 获取栈中有效元素个数
int StackSize(Stack* ps) {return ps->_top;
}
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps) {assert(ps);if (ps->_top) {return 0;}else {return 1;}
}
// 销毁栈
void StackDestroy(Stack* ps) {assert(ps);if (ps->_a) {free(ps->_a);}return;
}

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

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

相关文章

合并两个有序链表(冒泡排序实现)

实例要求:将两个升序链表合并为一个新的 升序 链表并返回;新链表是通过拼接给定的两个链表的所有节点组成的;实例分析:先拼接两个链表,在使用冒泡排序即可;示例代码: struct ListNode* mergeTwo…

Linux系统安装Anaconda

Linux系统安装Anaconda 前言 Anaconda是Python的环境管理器,下文介绍如何在Linux系统安装Anaconda。 下载 Anaconda官网:链接 。 个人版下载网址:链接 。 早期版本下载网址:链接 。 安装 使用Xftp软件将Linux版安装包传到服…

mysql常用函数

1.唯一 DISTINCT 2.排序 ORDER BY xxx; 升序 ORDER BY xxx desc; 降序 题目描述 select DISTINCT author_id as id from Views where author_id viewer_id ORDER BY author_id;3.length(); 字符串长度 select tweet_id from Tweets where length(content) > 154.左连接 …

广成科技 USB CAN 【二次开发】

1数据类型: 1 BOARD_INFO 设备信息 2 CAN_OBJ 数据帧对象 3 CAN_STATUS CAN通道状态 4 ERR_INFO 错误信息 5 INIT_CONFIG 设备配置参数 6 FILTER_RECORD 过滤帧配置参数 1 设备信息public struct BOARD_INFO {public ushort hw_Ver…

vs2017 编译Qt 5.11.2 源码

SDK 10.0.22000.194 有 2种编译方式 ,第二种 看下面 方式一: 1、问题描述: 使用VS编译程序时,运行库选择多线程(/MT),表示采用多线程静态release的方式进行编译。 但是,发现编译是不能通过的…

【C++】多态的使用详解

本篇要分享的内容是多态,以下为本篇目录。 目录 1.多态的概念 2. 多态的定义及实现 3.虚函数 4.C11 override和final 4.1final关键字 4.2override关键字 5.抽象类 5.1抽象类的概念 5.2接口继承和实现继承 1.多态的概念 通俗来说,就是多种形态…

RedisInsight——redis的桌面UI工具使用实践

下载 官网下载安装。下载地址在这里 填个邮箱地址就可以下载了。 安装使用。 安装成功后开始使用。 1. 你可以add一个地址。或者登录redis cloud 去auto-discover 2 . 新增你的redis库地址。注意index的取值 3。现在可以登录到redis了。看看结果 这是现在 在服务器上执行…

AC修炼计划(AtCoder Beginner Contest 328)

传送门: Toyota Programming Contest 2023#7(AtCoder Beginner Contest 328) - AtCoder 本章对于自己的提升:dfs的运用,带权并查集,以及状压dp。 A,B,C题比较简单,直接…

虚拟机配置完NAT模式之后可以和主机ping通但是ping 百度显示:网络不可达

具体linux网络配置看这:http://t.csdnimg.cn/KRami 解决方案如下: 如果这里网关为空,那么和我遇到的问题一样网关没有设置上,在这直接配置网关之后重启即可

【Spring Boot】如何自定义序列化以及反序列器

在我们使用默认的消息转换器,将java的Long类型通过json数据传输到前端JS时,会导致Long类型的精度丢失,这是因为JS处理Long类型数字只能精确到前16位,所以我们可以采用自定义序列化方式将Long类型数据统一转为String字符串&#xf…

windows10关闭自动更新

windows10关闭自动更新 下载策略组改配置组配置 下载策略组 我自己的电脑里没有这个文件gpedit.msc所以要下载 pushd "%~dp0"dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txtdir /b C:\Windows…

【算法基础】高精度运算

文章目录 高精度加法高精度减法高精度乘法高精度除法 高精度加法 主要思路就是利用编程模拟人工的加法 方便操作使用vector来存储这些数 为了方便进位,需要将原数字倒过来存储到vector中 加完所有位之后别忘了判断最后一位的进位 最后需要将vector中的数倒着输出 …

机器学习算法项目开发流程

机器学习算法是当今人工智能领域最重要的技术之一,它可以让计算机通过学习数据中的模式和规律来实现预测和决策。在实际应用中,开发一个成功的机器学习算法项目需要遵循一定的开发流程。本文将介绍一个常见的机器学习算法项目开发流程,帮助读…

odoo16前端框架源码阅读——env.js

env.js(env的初始化以及服务的加载) 路径:addons\web\static\src\env.js 这个文件的作用就是初始化env,主要是加载所有的服务。如orm, title, dialog等。 1、env.js 的加载时机 前文我们讲过前端的启动函数,start.…

系统安全测试详解

一、前言 我刚开始接触安全测试的时候,想的最多就说那种在昏暗的灯光下,带着神秘面具的黑客,对着键盘噼里啪啦一顿猛如虎的操作,然后长舒一口气,最后来了句yes,完美收工! 随后的职业生涯中&am…

LaTex 空行

在LaTeX中,可以通过命令\vspace{\baselineskip}或者使用\bigskip来插入一个空行。 以下是示例代码: 这是一段文字。\vspace{\baselineskip}这是下一段文字。或者: 这是一段文字。\bigskip这是下一段文字。

你是否了解Spring @EventListener注解?

当创建一个大型的应用程序时,我们经常需要处理各种事件。Spring框架提供了一个强大的事件处理机制,允许我们在应用程序中定义和监听事件。其中,EventListener注解是Spring框架中用于监听事件的主要注解之一。在本篇博客中,我们将深…

Django学习日志08

如何开启事务 事务的目的:为了保证多个SQL语句执行成功,执行失败,前后保持一致,保证数据安全 ACID属性: A:原子性(Atomicity):指事务是原子的,对事务中的操…

Mysql 索引与事务

1. 索引 1.1 什么是索引 当我们看一本书时可以通过目录快速的定位到我们想要的章节 ,在数据库中查询数据也需要遍历表,而且数据库是把数据存储在硬盘上的,所以读取数据十分的慢,因此就可以给数据库引入索引,提高查询…