【数据结构】栈各个接口的实现

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

目录

前言:

一、栈的概述:

1.栈的概念:

二、栈接口的实现:

1.栈的初始化:

2.压栈:

3.出栈:

4.取栈顶元素:

5.计算栈内有效数据:

6.判断栈是否为空:

7.栈的销毁:

三、完整代码:

1.Stack.h:

2.Stack.c:

总结:

前言:

     前面我们已经学习了顺序表和链表的相关知识和对各个接口实现,而今天我们将对栈进行学习。

一、栈的概述:

1.栈的概念:

        栈也叫栈堆,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一段被称为栈顶,相对的把另一端称之为栈底。像栈插入元素称之为进栈、入栈或压栈,它是把新元素放到栈顶的位置。从栈删除元素又称之为出栈或者退栈,它是把栈顶的元素删除掉,使相邻的元素成为新的栈顶元素。(后进后出)

我们可结合图片来理解:

进栈、入栈或压栈:

【数据结构】栈各个接口的实现

 出栈或者退栈:

【数据结构】栈各个接口的实现

二、栈接口的实现:

        栈可用数组或链表实现,下面我统一用数组实现栈。

1.栈的初始化:

①.初始化前需要进行非空判断,防止对空指针进行操作。

②.确认非空之后将所有元素置为初始值。

③.Top值可以为0也可以为-1.区别在于:为0表示的事Top指向栈顶数据的下一个数据;-1则表示栈顶的数据。

void STInit(ST* ps)
{
	assert(ps);
	ps->a = (STDatatype*)malloc(sizeof(STDatatype) * 4);
	if (ps->a == NULL)
	{
		perror("malloc fail");
		return;
	}
	ps->capacity = 4;
	ps->top = 0;
}

2.压栈:

①.执行操作前需要进行非空判断,防止对空指针进行操作。

②.还要对栈空间进行判断,若栈中的top=capacit,则说明此时已经存满,需要进行扩容。

void STPush(ST* ps, STDatatype x)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		STDatatype* new= (STDatatype*)realloc(ps->a,sizeof(STDatatype) * (ps->capacity*2));
		if (ps->a == NULL)
		{
			perror("malloc fail");
			return;
		}
		ps->capacity *= 2;
		ps->a = new;
	}
	
		ps->a[ps->top] = x;
		ps->top++;
}

3.出栈:

①.执行操作前需要进行非空判断,防止对空指针进行操作。

②.删除栈顶数据,也就是出栈,这一步操作其实很简单,只需要将指向栈顶的下标减减即可,也就top--;但是在进行操作是要注意栈内是否还有元素,若没有数据则停止删除。

void STPop(ST* ps)
{
	assert(ps);

	if(ps->top>0)
	ps->top--;
}

4.取栈顶元素:

①.执行操作前需要进行非空判断,防止对空指针进行操作。

②.同时需要判断栈内是否存在数据。

③.若判断不为空,及栈内存在数据(可以获取栈顶数据),则返回栈顶内容,

STDatatype STTop(ST* ps)
{
	assert(ps);
	assert(!STEmpty(ps));
	
	return ps->a[ps->top-1];
}

5.计算栈内有效数据:

①.执行操作前需要进行非空判断,防止对空指针进行操作。

②.判断数据有效后,直接返回top就可以了。

int STsize(ST* ps)
{
	assert(ps);
	return ps->top;
}

6.判断栈是否为空:

①.执行操作前需要进行非空判断,防止对空指针进行操作。

②.直接对top进行判断即可,若top为初始值0,则说明栈内没有数据,返回真,不为0,则说明栈内有数据,返回假。

bool STEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;

}

7.栈的销毁:

①.执行操作前需要进行非空判断,防止对空指针进行操作。

②.直接释放ps->a并置空后,将top和capaci置为初始值0就可以了。

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

三、完整代码:

1.Stack.h:

#pragma once
#include<stdio.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);
int STsize(ST* ps);
bool STEmpty(ST* ps);
STDatatype STTop(ST* ps);

2.Stack.c:

#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"
void STInit(ST* ps)
{
	assert(ps);
	ps->a = (STDatatype*)malloc(sizeof(STDatatype) * 4);
	if (ps->a == NULL)
	{
		perror("malloc fail");
		return;
	}
	ps->capacity = 4;
	ps->top = 0;
}
void STPush(ST* ps, STDatatype x)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		STDatatype* new= (STDatatype*)realloc(ps->a,sizeof(STDatatype) * (ps->capacity*2));
		if (ps->a == NULL)
		{
			perror("malloc fail");
			return;
		}
		ps->capacity *= 2;
		ps->a = new;
	}
	
		ps->a[ps->top] = x;
		ps->top++;
}
void STPop(ST* ps)
{
	assert(ps);

	if(ps->top>0)
	ps->top--;
}
int STsize(ST* ps)
{
	assert(ps);
	return ps->top;
}
bool STEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;

}
STDatatype STTop(ST* ps)
{
	assert(ps);
	assert(!STEmpty(ps));
	
	return ps->a[ps->top-1];
}
void STDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->top = 0;
	ps->capacity = 0;
}

总结:

        今天对栈的实现到此就结束,分别讲解栈的概念和栈接口的实现,我今天使用数据实现栈,大家理解完之后,可以尝试使用链表实现,帮助自己更好的理解和使用栈的相关操作。

        文章仍有许多不足,欢迎大家私信交流。文章来源地址https://www.toymoban.com/news/detail-413485.html

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

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

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

相关文章

  • C语言数据结构(0)——前言

    欢迎来到博主的新专栏——C语言与数据结构 博主id:代码小豪 在前两个专栏当中,博主已经大致的讲过了C语言中的大部分使用方法。大家都知道,学习英语时,首先掌握的是单词,随后学习语法,如此才能融会贯通的学习英语。如果学英文只会单词,那么阅读虽然不成问题

    2024年01月17日
    浏览(42)
  • 【Java数据结构 -- 实现双链表的接口方法】

    双链表是一种数据结构,其中每个节点包含 一个指向前一个节点的指针和一个指向后一个节点的指针 。由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来,因此双链表可以任意且快速的插入和删除元素。 引用接口IList,在把

    2024年01月16日
    浏览(57)
  • 数据结构 —— 双向链表(超详细图解 & 接口函数实现)

    数据结构 —— 顺序表 数据结构 —— 单链表 数据结构 —— 双向链表 数据结构 —— 队列 数据结构 —— 栈 数据结构 —— 堆 数据结构 —— 二叉树 数据结构 —— 八大排序 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元

    2024年02月11日
    浏览(41)
  • 【数据结构】 List与顺序表及接口的实现

    在集合框架中, List是一个接口,继承自Collection。 Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示: Iterable也是一个接口,表示实现该接口的类是可以逐个元素进行遍历的,具体如下: List 的官方文档 站在数据结构的角度来看, List就是一

    2024年02月12日
    浏览(39)
  • 【数据结构】_4.List接口实现类LinkedList与链表

    目录 1.链表的结构与特点 1.1 链表的结构: 1.2 链表的特点: 2. 不带头单链表的模拟实现 3. 单链表OJ 3.1 题目1:移除链表元素:  3.2 题目2:反转一个单链表 3.3 题目3:返回链表的中间结点 3.4 题目4:链表的倒数第k个结点 3.5 题目5:合并两个有序链表 3.6 题目6:链表的回文结构

    2024年02月15日
    浏览(44)
  • 【数据结构】带你深入栈和队列,轻松实现各种接口功能

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,我们继续来学习初阶数据结构的内容,今天我们要讲的是栈与队列内容中队列部分的内容 好了,废话不多说,开始今天的学习吧! — 队列:只允许在一端进行插入数据操作,在另一端进行

    2024年02月13日
    浏览(47)
  • 数据结构入门(C语言版)线性表带头双向循环链表接口实现

    在上一篇博客我们讲述了链表的概念和结构,还实现了无头单向非循环链表接口写法,那么这一章节,我们来实现另一种常用的链表组成结构——带头双向循环链表。 如果对前面的链表基本概念还是不了解,可以看作者的上一篇博客: 线性表中链表介绍及无头单向非循环链

    2023年04月12日
    浏览(45)
  • 【数据结构】速速收藏,一文带你参透双向链表各接口实现

    目录 🥕前言🥕: 🌽一、双向链表概述🌽: 1.双向链表概念: 2.双向链表结构: 🍆二、双向链表接口实现🍆: 1.工程文件建立: 2.接口实现(本文重点): Ⅰ.双向链表初始化: Ⅱ.打印双向链表: Ⅲ.申请新节点: Ⅳ.双向链表尾插: Ⅴ.双向链表尾删: Ⅵ.双向链表头插

    2024年02月02日
    浏览(40)
  • 【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,我们接着之前讲过的顺序表来继续介绍初阶数据结构的内容,今天给大家带来的是有关链表的基本知识和各种接口功能的实现 好了,废话不多说,开始今天的学习吧! — 概念:链表是一种

    2024年02月14日
    浏览(49)
  • 数据结构入门(C语言版)线性表中顺序表介绍及接口实现

    C语言的学习结束,就该入门数据结构了呦 不论在程序员的工作上,还是在学习或是考研上,数据结构都是一门非常重要且值得我们一直研究探索的学科,可以说数据结构和算法就是编程的核心。OK,接下来我们来到数据结构的入门第一步就是学习线性表,接下来由作者来详细

    2023年04月12日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包