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

C语言:最小栈(栈的接口实现Init、push、pop、top、getmin、free) 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) – 将元素 x 推入栈中。 pop() – 删除栈顶的元素。 top() – 获取栈顶元素。 getMin() – 检索栈中的最小元素。 示例: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); mi... 阅读详情

栈的概念

  • 栈:
    一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出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;
}
【数据结构】栈的接口实现(附图解和源码) 本文介绍栈的接口实现(附图解和源码),如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持! 阅读详情

相关推荐

初阶数据结构【栈及其接口的实现】

前面我们学习并实现了顺序表与链表的接口,顺序表与链表都是线性表的一种,即在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的;这期我们继续来介绍一种特殊的线性表——栈;这期我们用C语言实现了栈的几个基本接口,我们有了前面的基础,我们发现这并不是很难;下期见!26考研加油!

吴先生的博客 953

C语言栈底层接口实现指南

那么对于顺序表和链表在缓存利用率上就会有差别,顺序表利用率高而链表利用率就会低一些,因为在压数据时是成块压入的,链表不是连续存储的,在数据与数据之间会存在垃圾数据,而顺序表的数据是连续存放的所以顺序表的缓存利用率要高一些,而链表要低一些,虽然有差距但是差距不是很大,他的差距可能就像90分和80分的差距。对于栈而言是一个相对简单的数据结构,有后进先出的特点,在插入和删除时固定一端。//我个人喜欢用顺序表来定义栈,因为内存利用率高一些,再一个就是对于栈我们只需要尾插和尾删就可以了,用顺序表很舒服。

2302_81731744的博客 175

Emuelec系统安装全流程:超详细版指南(从零开始)

手把手带你完成emuelec系统的完整安装,从基础准备到系统配置一步不落,适合新手入门。深入解析emuelec在各类设备上的部署技巧,让复古游戏体验更流畅。

weixin_42594419的博客 1971

C语言 栈的接口实现

栈的概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的删除操作叫做出栈。出数据也在栈顶。 话不多说了解了栈的特点以后,直接看实现代码: //Stack.h //栈的相关接口的...

lovehang99的博客 477

SGLang:结构化生成语言推理框架深度解读

SGLang是由斯坦福大学和加州大学伯克利分校联合提出的高性能大语言模型推理框架,针对复杂多轮对话、结构化输出等场景优化。其核心创新包括: RadixAttention机制:通过基数树数据结构实现跨请求的KV Cache自动复用,避免重复计算共享前缀 跳跃前瞻解码:对格式化输出中的固定模板部分直接填充,仅采样变量槽位,提升3-5倍生成速度 约束解码引擎:通过正则表达式和JSON Schema保证输出严格符合预定义格式 声明式DSL:提供类Python的编程接口简化复杂推理流程开发 相比传统框架,SGLang

Ricky Yang的专栏 331

从零搭建芯片设计环境:在Cadence虚拟机中集成QRC进行寄生参数提取

本文详细介绍了在Cadence虚拟机中集成QRC工具进行芯片设计中的寄生参数提取的全流程。从环境准备、QRC安装配置到实际提取操作,提供了完整的步骤指南和常见问题解决方案,帮助工程师高效搭建芯片设计环境并优化提取性能。

weixin_30379531的博客 618

C栈的链式存储接口实现

#include <stdlib.h> //节点结构体 struct stackNode { struct stackNode *next; }; //栈的结构体 struct LStack { struct stackNode * pHeader; int m_size; }; typedef void* LinkStack; //初始化 LinkStack intt_LinkStack() { struct LStack * myStack = mall

weixin_47776194的博客 103

解决Anaconda环境下catkin_make编译报错:Python路径冲突与empy模块缺失

本文详细分析了在Anaconda环境下使用catkin_make编译时出现的Python路径冲突与empy模块缺失问题,提供了快速解决方案和永久性环境配置方法。通过显式指定Python解释器路径或调整Anaconda配置,有效解决编译报错问题,适用于ROS开发与科学计算并行的场景。

weixin_28829629的博客 353

【数据结构】深度剖析栈的各接口功能实现

前面我们学习了顺序表与链表的相关知识,也实现了它们各自的所有常用功能接口,理清了二者的使用差异和适用条件,而今天我们就将进入下一部分关于 栈(stack)的研究之中。

weixin_59392935的博客 1588

智能驾驶感知模块的测试评估方法(上)

对于智能驾驶系统而言,感知模块是开发难度最大、投入资源最多的核心部分。在智能驾驶开发团队内部,感知模块需要独立进行评测才能及早发现潜在缺陷或判断性能是否有改进。随着近几年BEV、OCC、E2E等新技术方案被越来越多企业应用,感知的评测变得越来越艰难,效率也变得越来越低下。本文作者基于在智驾测试行业多年经验,试图总结感知评测的基本规律和效率提升方法,以供读者一些启发。

vincent_321的博客 2559

【爬虫实战】Instagram博主图片爬取:模拟登录+滚动加载,轻松抓取高清美图

在当今社交媒体时代,Instagram作为全球最受欢迎的图片分享平台之一,汇聚了无数优质博主的海量精美图片。对于数据爱好者、营销分析师、AI训练数据收集者来说,如何高效、稳定地爬取Instagram博主的图片,成为了一项极具实用价值的技术挑战。然而,Instagram的反爬机制日益严格,传统的静态页面请求已经无法满足需求。本文将带你从零开始,使用2024-2025年最新技术栈,实现模拟登录、滚动加载、高清图片下载的全流程爬虫。✅ 全流程代码可直接运行✅ 模拟手机端请求绕过反爬。

2201_76125261的博客 596

栈的结构分析与基本接口c语言实现

栈是一种仅在一端进行操作的数据接口,它遵循先入后出的规则。栈可以用前面学过的链表表示也可以使用顺序表来进行实现。 因为栈通常最常用的操作是在尾部进行插入和删除,故利用顺序表来实现栈再合适不过了!(时间复杂度较低,不需要遍历来寻找最后一个节点)。 各种接口的实现原理也与顺序表基本相同。 首先,定义栈的基本结构体 typedef int DtaType; typedef struct Sta...

qq_39527730的博客 250

vLLM显存逆向计算:如何得到最优gpu-memory-utilization参数

本文提出了一种**逆向工程**的思路:基于vLLM显存占用的底层机制,通过精确计算模型权重、KV缓存、激活内存等各组件的显存需求,**倒推出最优的gpu-memory-utilization参数**。这种方法让我们能够在部署前就准确预估资源需求,实现一次配置、稳定运行。本文我们将从vLLM显存计算的核心原理出发,构建完整的倒推计算框架和源码,并通过大量实验验证其准确性(会有误差,但基本可以直接使用)。

羊城迷鹿的博客 1947

栈和队列及其多种接口实现-c语言

今天我们来完成栈和队列,首先我们要明白什么是栈,什么是队列。我们之前写过顺序表,链表,这都是数据结构,而栈和队列,也是数据结构,栈的特殊地方在于,栈是后进先出,也叫LIFO(last in first out),比如我们平时在桌子上堆放的书,我们堆放了十本书,如果不直接把书抽出来的话,我们要拿到最下面那本书,需要把上面九本先拿下去,也就是先要从最上面的那一本开始拿,而最上面的那一本,是我们最后放上去的,这就是一个栈。

KLZUQ的博客 833

HyperLynx(三十一)高速串行总线仿真(三)

(5)选择 “File”→ “Open Touchstone”,打开路径 C:\Adv_HL_Tmg\SERDES_Interface\models,选中connector.s4p,单击打开,如图所示。接下来,找出将要分配模型的S参数连接。(12)单击“Assign”按钮,选择模型类型为“Touchstone models”,在库中选择“connector.s4p”,如图所示。(14)单击“OK”按钮,选中“connector.s4p”这一行,单击“Connection Editor”按钮,如图所示。

小幽余生不加糖 3366

Statistics and Machine Learning Toolbox

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

C栈的顺序存储 接口实现

#define MAX 1024 #include <stdlib.h> #include <string.h> #include <stdio.h> struct SStack { void * data[MAX];//栈的数组 int m_Size;//栈大小 }; typedef void* SeqStack; //初始化栈 SeqStack intt_SeqStack() { struct SStack *myStack = malloc

weixin_47776194的博客 111

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

数据结构复习笔记————栈的常用接口实现(c语言)

栈栈的概念栈的选择题栈的常用接口实现1.栈的创建2.栈的初始化3.栈的销毁4.栈的判断是否为空5.进栈6.出栈(删除数据)7.出堆顶的数据8.返回栈中数据的个数有效括号 栈的概念 栈:一种特殊的线性表,只允许固定一端入进行删除和插入数据,进行插入和删除数据的一端为栈顶,另一端为栈底。 入栈:栈的插入数据为入栈,入的数据在栈顶 出栈:栈的删除数据为出栈,删除数据也在栈顶 特点:后进先出,先进后出。 栈的选择题 4.若进栈序列为 1,2,3,4 ,进栈过程中可以出栈,则下列不可能的一个出栈序列是()

sjp11的博客 1221

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【数据结构】栈的接口的实现(用c语言实现)

栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LFO (Last In First Out)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的删除操作叫做出栈。出数据也在栈顶。   栈的实现 栈的实现一般可以使用数组或者链表实现,相对...

qq_42270373的博客 458

顺序表实现栈

对于顺序表,在 C语言 中表现为数组,在进行栈的定义之前,我们需要考虑以下几个点:1)栈数据的存储方式,以及栈数据的数据类型;2)栈的大小;3)栈顶指针;我们可以定义一个栈的结构体,C语言实现如下所示:int// (1)100005// (2)// (4)int top;// (5)(1) 用DataType这个宏定义来统一代表栈中数据的类型,这里将它定义为整型,根据需要可以定义成其它类型,例如浮点型、字符型、结构体 等等;(2)maxn代表我们定义的栈的最大元素个数;

Doctor_Anonymous的博客 1735

【数据结构初阶】队列接口实现及用队列实现栈超详解

1. 概念 1. 1 队列底层结构选型 1. 2 队列定义 2. 接口实现 2. 1 初始化 2. 2 判空 2. 3 入队列 2. 4 出队列 2. 5 队尾元素和队头元素和队列元素个数 2. 6 销毁 2. 7 接口的意义 3. 经典OJ题 3. 1 用队列实现栈 3. 1. 1 栈的定义 3. 1. 2 栈的初始化 3. 1. 3 入栈 3. 1. 4 出栈 3. 1. 5 取栈顶元素 3. 1. 6 判空 3. 1. 7 销毁

fhvyxyci的博客 2050

DS--栈的概念及其接口的实现(顺序表)以及如何用两个栈来实现一个队列(C语言版)

栈的概念: 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。 原则:后进先出(LIFO) 压栈:栈的插入操作叫做进栈,入数据在栈顶 出栈:栈的删除操作也叫做出栈,出数据也在栈顶 通过动态顺序表来实现栈的接口: 声明文件stack.h #ifndef _STACK_H_ #define _STACK_H_ #include&l...

烟华的博客 313

C语言实现 - 栈

栈是一种特殊的线性表,数据的存取方式是后进先出,最后进入的数据称为栈顶,第一个进入的数据称为栈底。只能在栈顶对数据进行读取、删除、插入。删除数据称作:出栈或退栈插入数据称作:进栈、入栈或压栈

ee268的博客 1576

【C语言】数据结构-栈

我真诚的希望你能够阅读本文时,得到一些帮助与启发这是我第一次尝试省去每段接口的单独思路分析,而是直接对代码进行较为详细的注释文中当然还存在各种各样的不足,欢迎私信告诉我,同时,我知道我的表达水平有限,语言也还不够通俗易懂,所以我随时欢迎你的私信我是真的掌握了这部分的内容才将它写出来,所以,有任何疑问,call me!!

m0_74292919的博客 974

栈(stack) C语言实现 详解

文章目录前言一、栈的概念及结构二、使用步骤1.引入库2.读入数据总结 前言 当提及“栈”这个概念,很多初学者都会很迷茫。在C语言里,我们有一个内存区域叫做栈区。而在算法中,我们也有一个同名结构叫做栈。 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 一、栈的概念及结构 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进

qq_52208569的博客 2857

【经典数据结构OJ讲解】你知道如何用两个队列实现一个栈,如何用两个栈实现一个队列吗?

你是否真正理解了栈和队列的结构呢?来试一试用栈来实现队列吧,来试一试用队列实现栈吧!这两道算法题可以帮助你更好的理解栈和队列的概念!

qq_63992711的博客 1087

栈的表示和实现(C语言)

本篇博客详细介绍了数据结构中“栈”的概念结构、练习题、基于C语言的代码实现。

Prefectkn的博客 528
上一篇: 带头双向循环链表各种接口的实现(C)
下一篇: 队列的各种接口的实现(C)
ChoSeitaku
博客等级 码龄5年 3452粉丝 557原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值