一篇文章带你实现栈的接口

这篇具有很好参考价值的文章主要介绍了一篇文章带你实现栈的接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一,什么是栈

栈(Stacks)是限定在一端插入和删除的线性表。允许插入和删除的一端称为栈顶(Top),另一端称为栈底(Bottom)。栈中的数据元素遵守后进先出(Last In First Out)的原则。因此,栈又称为后进先出(先进后出)线性表。

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

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

如图所示:

一篇文章带你实现栈的接口,数据结构1,算法,数据结构,c语言,链表

 二,栈的实现

栈的实现一般有两种存储方法,顺序栈(数组)和链栈(链表)。

这里我们采用顺序栈。

一篇文章带你实现栈的接口,数据结构1,算法,数据结构,c语言,链表

 

2.1,栈的结构

这里采用支持动态增长的栈,用a来指向空间中对应数组的地址。用top来表示栈顶,用capcity表示容量,到后面容量不够扩容用。

typedef int SDataType;
typedef struct Stack
{
	SDataType* a;//数组存储数据
	int top;//栈顶
	int capcity;//容量
}ST;

2.2,栈的接口

void STInit(ST* p);//栈的初始化
void STPush(ST* p, SDataType x);//压栈
bool STEmpty(ST* p);//判断数据是否为空
void STPop(ST* p);//出栈
SDataType STTop(ST* p); //取栈顶数据
void STDestroy(ST* p);//栈的销毁
int STSize(ST* p);//栈的大小

三,接口的实现。

3.1,栈的初始化

这里先申请一个4个字节的空间。容量为4。top可以是0,也可以是1。

void STInit(ST* p)//栈的初始化
{
	assert(p);
	p->a = (SDataType*)malloc(sizeof(SDataType)*4);
	p->top = -1;//top = 0 时是栈顶的下一个位置。top =-1 是栈顶的位置。
	p->capcity = 4;
}

3.2,栈的插入(压栈)

这里插入数据前判断一下容量是否充足,如果不足,就用realloc扩容成原来容量的2倍。最后将x插入到栈顶中。注意:p->top++;//这里加加后,访问栈顶的元素直接可以用a[p->top]

void STPush(ST* p, SDataType x)//压栈
{
	assert(p);
	if (p->capcity == p->top + 1)
	{
		SDataType* tmp = (SDataType*)realloc(p->a, sizeof(SDataType) * p->capcity * 2);
		if (tmp == NULL)
		{
			perror("realloc fail");
		}
		p->a = tmp;
		p->capcity *= 2;

	}
	p->a[p->top + 1] = x;
	p->top++;//这里加加后,访问栈顶的元素直接可以用a[p->top]

}

3.3,出栈

这里在top减一之前需要判断一下栈是否为空的情况。

void STPop(ST* p)//出栈
{
	assert(p);
	assert(!STEmpty(p));//判断是否为空
	p->top--;
}

栈为空的实现

这里bool(布尔值)的头文件为:stdbool.h,如果为空返回1,不为空等号不成立,返回0;

bool STEmpty(ST* p)
{
	assert(p);
	return p->top + 1 == 0;
}

3.4,获取栈顶元素

这里还是判断一下是否为空,然后返回栈顶元素。

SDataType STTop(ST* p) //取栈顶数据
{
	assert(p);
	assert(!STEmpty(p));
	return p->a[p->top];
}

3.5,栈的大小

这里判断完非空后,直接返回top+1(看完上面的压栈程序中,这里可以把top理解成数组下标,加一是总大小)。

int STSize(ST* p)//栈的大小
{
	assert(p);
	assert(!STEmpty(p));
	return p->top + 1;
}

3.6,栈的销毁

把申请的空间释放,再置为空。其余赋值为0;

void STDestroy(ST* p)//栈的销毁
{
	assert(p);
	free(p->a);
	p->a = NULL;
	p->capcity = 0;
	p->top = 0;
}

四,总代码

//test.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<stdbool.h>
#include<stdlib.h>
typedef int SDataType;
typedef struct Stack
{
	SDataType* a;//数组存储数据
	int top;//栈顶
	int capcity;//容量
}ST;
void STInit(ST* p);//栈的初始化
void STPush(ST* p, SDataType x);//压栈
bool STEmpty(ST* p);//判断数据是否为空
void STPop(ST* p);//出栈
SDataType STTop(ST* p); //取栈顶数据
void STDestroy(ST* p);//栈的销毁
int STSize(ST* p);//栈的大小

//stack.c接口的实现
#define _CRT_SECURE_NO_WARNINGS 1
#include"test.h"
void STInit(ST* p)//栈的初始化
{
	assert(p);
	p->a = (SDataType*)malloc(sizeof(SDataType)*4);
	p->top = -1;//top = 0 时是栈顶的下一个位置。top =-1 是栈顶的位置。
	p->capcity = 4;
}
void STPush(ST* p, SDataType x)//压栈
{
	assert(p);
	if (p->capcity == p->top + 1)
	{
		SDataType* tmp = (SDataType*)realloc(p->a, sizeof(SDataType) * p->capcity * 2);
		if (tmp == NULL)
		{
			perror("realloc fail");
		}
		p->a = tmp;
		p->capcity *= 2;

	}
	p->a[p->top + 1] = x;
	p->top++;

}
void STPop(ST* p)//出栈
{
	assert(p);
	assert(!STEmpty(p));
	p->top--;
}
SDataType STTop(ST* p) //取栈顶数据
{
	assert(p);
	assert(!STEmpty(p));
	return p->a[p->top];
}
void STDestroy(ST* p)//栈的销毁
{
	assert(p);
	free(p->a);
	p->a = NULL;
	p->capcity = 0;
	p->top = 0;
}
int STSize(ST* p)//栈的大小
{
	assert(p);
	assert(!STEmpty(p));
	return p->top + 1;
}
bool STEmpty(ST* p)
{
	assert(p);
	return p->top + 1 == 0;
}
//test.c接口的测试
#define _CRT_SECURE_NO_WARNINGS 1
#include"test.h"
int main()//测试
{
	ST s;
	STInit(&s);
	STPush(&s, 0);
	printf("%d\n", STTop(&s));
	STPush(&s, 1);
	printf("%d\n", STTop(&s));
	STPush(&s, 2);
	printf("%d\n", STTop(&s));
	STPush(&s, 3);
	printf("%d\n", STTop(&s));
	STPop(&s);
	STPop(&s);
	printf("%d\n", STTop(&s));

	printf("%d\n", STSize(&s));
	return 0;
}

好了,到这里就该结束了。希望对大家有所帮助!文章来源地址https://www.toymoban.com/news/detail-641299.html

到了这里,关于一篇文章带你实现栈的接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • b树(一篇文章带你 理解 )

    目录 一、引言 二、B树的基本定义 三、B树的性质与操作 1 查找操作 2 插入操作 3 删除操作 四、B树的应用场景 1 数据库索引 2 文件系统 3 网络路由表 五、哪些数据库系统不使用B树进行索引 1 列式数据库 2 图形数据库 3 内存数据库 4 NoSQL数据库 5 分布式数据库 六、总结 在计算

    2024年03月17日
    浏览(47)
  • 一篇文章带你入门HBase

    本文已收录至Github,推荐阅读 👉 Java随想录 微信公众号:Java随想录 目录 HBase特性 Hadoop的限制 基本概念 NameSpace Table RowKey Column TimeStamp Cell 存储结构 HBase 数据访问形式 架构体系 HBase组件 HBase读写流程 读流程 写流程 MemStore Flush 参数说明 StoreFile Compaction 参数说明 触发过程

    2024年02月08日
    浏览(51)
  • 一篇文章带你了解SpringBoot目录结构

    前言 SpringBoot是整合Spring技术栈的一站式框架,是简化Spring技术栈的快速开发脚手架,是一个能够快速构建生产级别的Spring应用的工具。SpringBoot是目前流行的微服务框架,倡导“约定优于配置”,简化Spring项目搭建及开发过程。springboot提供了很多核心的功能,比如自动化配置

    2024年03月25日
    浏览(58)
  • 一篇文章带你走进Java(保姆级)

    手打不易,希望对各位还在徘徊学什么语言的有帮助!!java不会让你失望!! Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义。 Java还是有一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持

    2024年02月15日
    浏览(45)
  • 一篇文章带你快速认识区块链(必看)

           区块链技术,这一划时代的分布式账本技术,正在全球范围内掀起一场深度的信任与协作模式变革。区块链如同一部由多方共同维护的公开而又安全的大账本,每一笔交易都被打包成一个区块,通过高级密码学手段确保传输和访问安全,并按照时间顺序串联起来,形

    2024年04月25日
    浏览(50)
  • 一篇文章带你搞懂前端Cookie

    浏览器Cookie相信各位点进这篇文章的小伙伴应该不陌生了,它是前端领域中一个非常重要的内容,当然也是面试的一个考点,不知道各位小伙伴是否真正掌握了Cookie呢?当然没有掌握也是没有关系的,可以跟着小编的脚步一起来学习一下前端Cookie,没有熟练掌握的小伙伴看完这

    2024年02月04日
    浏览(38)
  • 一篇文章带你了解什么是JDK

    JDK(Java Development Kit)是Java开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源。下面是JDK的一些重点介绍: Java编译器(javac):JDK包含了Java编译器,可以将Java源代码编译为Java字节码。通过编译器,开发人员可以将Java源代码转换为可在JVM上运行的字节码文

    2024年03月19日
    浏览(87)
  • 一篇文章带你了解什么是图灵完备

    图灵完备(Turing-complete)是一个计算机科学中的概念,它指的是一种计算模型能够模拟任何其他计算模型的能力。这意味着,只要一种计算模型是图灵完备的,那么它就能够完成任何可计算的任务。 图灵完备是指一种计算机语言或计算模型具有足够的能力来模拟图灵机的所有

    2024年02月15日
    浏览(36)
  • 【C++】一篇文章带你深入了解vector

    vector的文档介绍 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。 本质讲,

    2024年04月22日
    浏览(37)
  • 一篇文章带你详细了解axios的封装

    对请求的封装在实际项目中是十分必要的,它可以让我们统一处理 http 请求。比如做一些拦截,处理一些错误等。本篇文章将详细介绍如何封装 axios 请求,具体实现的功能如下 基本配置 配置默认请求地址,超时等 请求拦截 拦截 request 请求,处理一些发送请求之前做的处理,譬如给

    2024年02月07日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包