栈的各种接口的实现(C)

栈的概念

  • 栈:
    一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
  • 压栈:
    栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
  • 出栈:
    栈的删除操作叫做出栈。出数据也在栈顶。
    ![[Pasted image 20240919140145.png]]

栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。
用链表实现栈,栈顶在头节点,出栈和入栈用头删和头插
![[Pasted image 20240920222337.png]]

栈的定义
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;
  • 创建Stack结构体,重命名为ST,方便后续代码的书写
  • 重命名int为STDataType,方便后续对数据类型的修改
  • a是一个指针,用来表示数组
  • capacity表示栈的容量
初始化

top初始化为-1,意味着top是栈顶元素
初始化为0,意味着top是栈顶元素的下一个位置

void STInit(ST* ps)
{assert(ps);ps->a = NULL;ps->capacity = 0;ps->top = 0;
}

![[Pasted image 20240920224845.png]]

销毁
void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->top = ps->capacity = 0;
}
  • 判断ps是否为空
  • 释放空间
  • 指针置空
  • top和capacity也赋给0
入栈
void STPush(ST* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity){int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity);if (tmp == NULL){perror ("realloc fail");exit(-1);}pa->a = tmp;ps->capacity = newCapacity;}ps->a[ps->top] = x;ps->top++;
}

realloc如果第一个指针是空指针,效果和malloc一样

  • assert判断ps是否为空
    如果top等于capacity,进行扩容
  • 定义新容量,如果是0,就赋给4,否则乘以2倍
  • realloc新空间赋给一个新节点tmp,判断创建空间是否成功
  • 将tmp赋给a,新容量赋给capacity
出栈
void STPop(ST* ps)
{assert(ps);assert(ps->top > 0);--ps->top;
}
  • 判断ps是否为空
  • 判断栈是否为空
  • 将top–
获取栈顶元素
STDataType STTop(ST* ps)
{assert(ps);assert(ps->top > 0);return ps->a[ps->top - 1];
}
  • 判断ps是否为空
  • 判断栈是否为空
  • 由于top初始化为0,top表示栈顶元素的下一个位置,top-1就能获取栈顶元素
返回个数
int STSize(ST* ps)
{assert(ps);return ps->top;
}
  • 判断ps是否为空
  • 直接返回top
判断是否为空
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}
  • 判断ps是否为空
  • 返回判断top是否等于0,等于0返回true,不等于0返回false

栈声明定义分离实现

#pragma once#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;void STInit(ST* ps);
void STDestroy(ST* ps);
void STPush(ST* ps, STDataType x);
void STPop(ST* ps);
STDataType STTop(ST* ps);
int STSize(ST* ps);
bool STEmpty(ST* ps);
void STInit(ST* ps)
{assert(ps);ps->a = NULL;ps->capacity = 0;ps->top = 0;
}void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->top = ps->capacity = 0;
}void STPush(ST* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity){int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity);if (tmp == NULL){perror ("realloc fail");exit(-1);}pa->a = tmp;ps->capacity = newCapacity;}ps->a[ps->top] = x;ps->top++;
}void STPop(ST* ps)
{assert(ps);assert(ps->top > 0);--ps->top;
}STDataType STTop(ST* ps)
{assert(ps);assert(ps->top > 0);return ps->a[ps->top - 1];
}bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}

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

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

相关文章

join 命令:合并文件

一、命令简介 ​join​ 命令用于合并两个文件&#xff0c;基于一个共同的键&#xff08;key&#xff09;字段&#xff0c;将一个文件中的行与另一个文件中的行合并在一起。 这个键字段在两个文件中必须是相同的&#xff0c;这样 join 才能正确地将行匹配在一起。 ‍ 二、命…

linux系统维护:给linux的根目录分配更多的额外的磁盘空间,实现系统磁盘容量的平滑升级

目录 一、背景说明 二、概念介绍 1、物理卷&#xff08;Physical Volume, PV&#xff09; 2、卷组&#xff08;Volume Group, VG&#xff09; 3、逻辑卷&#xff08;Logical Volume, LV&#xff09;&#xff1a; 三、操作过程 1、vmware中新增磁盘 2、查看磁盘信息 3、格式化…

进阶版水仙花数水是指一个n位数,各个位数字的n次方之和等于该数字本身

两种方法&#xff1a; 第一种&#xff0c;是输入一个数值&#xff0c;判断是否为水仙花数 //打印水仙花数 //水仙花数是指一个n位数&#xff0c;各个位数字的n次方之和等于该数字本身 //如&#xff1a;1531^35^33^3 // //分析&#xff1a; //153/1015 //15/101 //1/100 #incl…

✨机器学习笔记(五)—— 神经网络,前向传播,TensorFlow

Course2-Week1: https://github.com/kaieye/2022-Machine-Learning-Specialization/tree/main/Advanced%20Learning%20Algorithms/week1机器学习笔记&#xff08;五&#xff09; 1️⃣神经网络&#xff08;Neural Network&#xff09;2️⃣前向传播&#xff08;Forward propaga…

【C++】list容器的基本使用

一、list是什么 list的底层结构是带头双向循环链表。 相较于 vector 的连续线性空间&#xff0c;list 就显得复杂很多&#xff0c;它是由一个个结点构成&#xff0c;每个结点申请的空间并不是连续的&#xff0c;它的好处是每次插入或删除一个数据&#xff0c;就配置或释放一个…

MATLAB绘图基础8:双变量图形绘制

参考书&#xff1a;《 M A T L A B {\rm MATLAB} MATLAB与学术图表绘制》(关东升)。 8.双变量图形绘制 8.1 散点图 散点图用于显示两个变量间的关系&#xff0c;每个数据点在图上表示为一个点&#xff0c;一个变量在 X {\rm X} X轴&#xff0c;一个变量在 Y {\rm Y} Y轴&#…

ACE搭建地图,助力企业新媒体矩阵优化升级

在数字化浪潮中&#xff0c;为了创造多元化的用户互动和销售机会&#xff0c;众多企业踊跃投入到线上平台&#xff0c;积极构建新媒体矩阵。 然而这条道路并非是坦途。很多对矩阵不了解或是认识不足的企业&#xff0c;想要搭建好矩阵还需要面临众多难题。 对新手来说&#xff0…

Qt 多线程TCP客户端使用QTimer进行重连服务器———附带详细代码和讲解

文章目录 0 背景1 原理1.1 QThread的线程归属1.2 Qtimer使用1.3 TCP客户端使用 2 问题解决2.1 解决思路2.2 解决方法 3 完整的代码示例3.1 tcp_client类3.2 主界面类 附录参考 0 背景 在子线程中&#xff0c;使用Qtimer来进行定时重连TCP服务器&#xff0c;总是会出现跨线程创…

如何通过思维链提升LLM推理能力?

思维链推理(Chain-of-Thought Reasoning)&#xff0c;因其彻底改变了模型处理复杂问题的解决方式&#xff0c;目前已成为人工智能领域最炙手可热的重大进展之一。 通过模拟推理过程&#xff0c;CoT训练大语言模型将复杂的问题拆解&#xff0c;并提供更清晰、更具逻辑的响应(re…

需求4:新加字段(进阶版)

关于加一个字段这种&#xff0c;我前几篇文章已经写过了。这篇文章的这个需求&#xff0c;也是写关于加字段的&#xff0c;只不过与前两篇文章不一样的是&#xff0c;这篇文章的这个需求讲的比较隐晦&#xff0c;需求没有直接跟你说要你加一个字段&#xff0c;要你自己想一下才…

(undone) 学习语音学中关于 i-vector 和 x-vector

来源&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber8461375 (这是一篇跟 X-vector 有关的论文) 这里有更适合初学者的两个资料: 1.https://www.youtube.com/watch?vR3rzN6JYm38 &#xff08;MIT教授的youtube视频&#xff09; 2.https://people.c…

【微信支付-服务商】SpringBoot集成微信服务商支付(多子商户集成)

SpringBoot集成微信服务商支付&#xff08;多子商户集成&#xff09; 前言一、前置工作1、获取商户平台的xxx核心参数2、关联对应的小程序&#xff08;appid&#xff09; 二、SpringBoot集成微信小程序1、引入pom依赖2、yml配置3、java代码文件3.1、Properties 配置类3.2 Confi…

基于JAVA+SpringBoot+Vue的学生干部管理系统

基于JAVASpringBootVue的学生干部管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345; 哈…

windows打开可选功能窗口的方式(呜呜设置里面找不到可选功能只能这样找了)

打开方式 winR打开运行窗口&#xff0c;输入fodhelper&#xff0c;按下回车键 即可快速打开可选功能窗口

ChemChat——大语言模型与化学的未来,以及整合外部工具和聊天机器人的潜力

概述 论文地址&#xff1a;https://arxiv.org/abs/2309.16235 虽然近年来技术创新和变革日新月异&#xff0c;从根本上改变了我们对生物化学过程的认识&#xff0c;但化学领域仍花费大量时间和金钱–"10 年 "和 “3000 亿”–将新产品推向市场。这是由于实验室实验的…

发现编程的全新境界——明基RD280U显示器使用体验

前言 在大学的四年里&#xff0c;我几乎每天都泡在实验室&#xff0c;盯着电脑屏幕&#xff0c;一行行地码代码。那时&#xff0c;学校提供的显示器是非常基础的款式&#xff0c;功能简单&#xff0c;几乎没有任何特别之处&#xff0c;甚至配置也比较低。那个时候&#xff0c;…

Shader 中的光源

1、Shader 开发中常用的光源属性 Unity当中一共支持四种光源类型&#xff1a; 平行光&#xff08;Directional&#xff09;点光源&#xff08;Point&#xff09;聚光灯&#xff08;Spot&#xff09;面光源&#xff08;Area&#xff09;— 面光源仅在烘焙时有用 不管光源类型到…

通过MCGS在ARMxy边缘计算网关上实现物流自动化

随着电子商务和智能制造的快速发展&#xff0c;物流行业面临着前所未有的挑战与机遇。高效的物流系统不仅可以加快货物周转速度&#xff0c;降低运营成本&#xff0c;还能显著提升客户满意度。 1. ARMxy BL340系列简介 ARMxy BL340系列是针对工业自动化领域设计的一款高性能、…

2024年最新苹果cms升级插件【泛目录专用】

苹果CMS是一款专为视频内容管理而设计的系统&#xff0c;近年来在视频站点搭建中逐渐成为热门选择。其直观的用户界面和灵活的管理功能&#xff0c;使得无论是新手还是专业开发者都能轻松上手。 苹果CMS提供了多种主题和模板&#xff0c;用户可以根据自身需求进行定制&#xf…

北京买新能源车,天津上牌攻略

背景说明 我是在北京买的新能源汽车&#xff08;增程式&#xff09;&#xff0c;因没有摇上北京车牌号&#xff0c;所以计划在天津上牌。前期问了一些代理&#xff0c;要是帮忙弄的话得花500元左右&#xff0c;要是自己搞定的话&#xff0c;大约150元左右&#xff08;130元的车…