数据结构 栈的概念及栈的实现

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

目录

1.栈的概念及结构

2.栈的实现 

2.1  初始化栈

2.2 入栈 

2.3 出栈 

2.4 获取栈顶元素

2.5 获取栈中有效元素个数 

 2.6  检测栈是否为空,如果为空返回非零结果,如果不为空返回0

2.7 销毁栈 

3. 完整代码

test.c

 Stack.h

Stack.c

 


1.栈的概念及结构

栈(后进先出,先进后出)

一种特殊线性表,其只允许在固定的一端进行插入删除元素操作

进行数据插入删除操作的一端 称为栈顶,另一端称为栈底

栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则

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

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

数据结构 栈的概念及栈的实现,数据结构,数据结构,开发语言,c++,c语言,算法,linux,windows

数据结构 栈的概念及栈的实现,数据结构,数据结构,开发语言,c++,c语言,算法,linux,windows

在内存区域中也有一个区域叫做栈 ,它们一个是数据结构,一个是内存区域

 数据结构 栈的概念及栈的实现,数据结构,数据结构,开发语言,c++,c语言,算法,linux,windows

2.栈的实现 

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小

数据结构 栈的概念及栈的实现,数据结构,数据结构,开发语言,c++,c语言,算法,linux,windows

数据结构 栈的概念及栈的实现,数据结构,数据结构,开发语言,c++,c语言,算法,linux,windows

// 下面是定长的静态栈的结构,实际中一般不实用,所以我们主要实现下面的支持动态增长的栈
typedef int STDataType;
#define N 10
typedef struct Stack
{
	STDataType a[N];
	int top; // 栈顶
}ST;

// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top; // 栈顶
	int capacity; // 容量
}ST;


void STInit(ST* pst);
void STDestroy(ST* pst);

// 栈顶插入删除
void STPush(ST* pst, STDataType x);
void STPop(ST* pst);
STDataType STTop(ST* pst);

bool STEmpty(ST* pst);
int STSize(ST* pst);

2.1  初始化栈

void STInit(ST* pst)
{
	//断言出现空指针
	assert(pst);
	pst->a = NULL;
	pst->capacity = 0;//栈容量
	// 如果top=0,表示top指向栈顶元素的下一个位置
	pst->top = 0;//栈顶

	// 如果top=-1,表示top指向栈顶元素
	//pst->top = -1;
}

在栈实现中top的初始值的选择是最关键的一点,top既可以初始化为0也可以初始化为-1,如果top=0,表示top指向栈顶元素的下一个位置 ,如果top=-1,表示top指向栈顶元素,这里我们top取0,如果top取-1,下面的一些条件也要发生变化

2.2 入栈 

void STPush(ST* pst, STDataType x)
{
	//断言出现空指针
	assert(pst);
	//判断空间大小是否足够,如果不够,则扩容
	if (pst->capacity == pst->top)
	{
		//如果初始空间为0,则赋为4,如果不是则扩容为原来的2倍
		int newcapacity = pst->capacity == 0 ? 4:pst->capacity * 2;
		//将扩容的新空间存起来
		STDataType* tmp = realloc(pst->a, sizeof(newcapacity)*newcapacity);
		//判定新空间是否开辟成功
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		//将开辟的新空间和空间大小赋给a和capacity
		pst->a = tmp;
		pst->capacity = newcapacity;
	}
	//赋值
	pst->a[pst->top] = x;
	pst->top++;
}

:数据结构中动态内存开辟非常重要,如果感觉不太熟悉的话可以看看我之前的文章(感谢支持!)C语言:动态内存管理-CSDN博客

2.3 出栈 

void STPop(ST* pst)
{
	断言出现空指针
	assert(pst);
	//这里top指向栈顶的下一个元素,top减一,看似没有删除元素,实则top已经指向要删除元素的下一个,要删除的元素变成了无效元素,从而达到删除的目的
	pst->top--;
}

这里top指向栈顶的下一个元素,top减一,看似没有删除元素,实则top已经指向要删除元素的下一个要删除的元素变成了无效元素,从而达到删除的目的,这种思想以后我们在数据结构中会经常遇到 。

2.4 获取栈顶元素

STDataType STTop(ST* pst)
{
	//断言出现空指针
	assert(pst);
	return pst->a[pst->top - 1];
}

2.5 获取栈中有效元素个数 

int STSize(ST* pst)
{
	//断言出现空指针
	assert(pst);
	return pst->top;
}

 2.6  检测栈是否为空,如果为空返回非零结果,如果不为空返回0

bool STEmpty(ST* pst)
{
	//断言出现空指针
	assert(pst);
	return pst->top == 0;
}

2.7 销毁栈 

void STDestroy(ST* pst)
{
	//断言出现空指针
	assert(pst);
	free(pst->a);
	pst->capacity = pst->top = 0;
}

3. 完整代码

test.c

#include"Stack.h"

int main()
{
	ST s;
	STInit(&s);
	STPush(&s, 1);
	STPush(&s, 2);
	STPush(&s, 3);
	//printf("%d ", STTop(&s));
	//STPop(&s);
	//printf("%d ", STTop(&s));
	//STPop(&s);

	STPush(&s, 4);
	STPush(&s, 5);

	//    一     对     多
	// 入栈顺序  --  出栈顺序
	while (!STEmpty(&s))
	{
		printf("%d ", STTop(&s));
		STPop(&s);
	}
	printf("\n");

	return 0;
}

 Stack.h

#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* pst);
void STDestroy(ST* pst);

// 栈顶插入删除
void STPush(ST* pst, STDataType x);
void STPop(ST* pst);
STDataType STTop(ST* pst);

bool STEmpty(ST* pst);
int STSize(ST* pst);

Stack.c

#include "Stack.h"


void STInit(ST* pst)
{
	//断言出现空指针
	assert(pst);
	pst->a = NULL;
	pst->capacity = 0;//栈容量
	// 如果top=0,表示top指向栈顶元素的下一个位置
	pst->top = 0;//栈顶

	// 如果top=-1,表示top指向栈顶元素
	//pst->top = -1;
}
void STDestroy(ST* pst)
{
	//断言出现空指针
	assert(pst);
	free(pst->a);
	pst->capacity = pst->top = 0;
}

// 栈顶插入删除
void STPush(ST* pst, STDataType x)
{
	//断言出现空指针
	assert(pst);
	//判断空间大小是否足够,如果不够,则扩容
	if (pst->capacity == pst->top)
	{
		//如果初始空间为0,则赋为4,如果不是则扩容为原来的2倍
		int newcapacity = pst->capacity == 0 ? 4:pst->capacity * 2;
		//将扩容的新空间存起来
		STDataType* tmp = realloc(pst->a, sizeof(newcapacity)*newcapacity);
		//判定新空间是否开辟成功
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		//将开辟的新空间和空间大小赋给a和capacity
		pst->a = tmp;
		pst->capacity = newcapacity;
	}
	//赋值
	pst->a[pst->top] = x;
	pst->top++;
}
void STPop(ST* pst)
{
	//断言出现空指针
	assert(pst);
	//这里top指向栈顶的下一个元素,top减一,看似没有删除元素,实则top已经指向要删除元素的下一个,要删除的元素变成了无效元素,从而达到删除的目的
	pst->top--;
}
STDataType STTop(ST* pst)
{
	//断言出现空指针
	assert(pst);
	return pst->a[pst->top - 1];
}

bool STEmpty(ST* pst)
{
	//断言出现空指针
	assert(pst);
	return pst->top == 0;
}
int STSize(ST* pst)
{
	//断言出现空指针
	assert(pst);
	return pst->top;
}

感谢观看,希望能对你有所帮助 !文章来源地址https://www.toymoban.com/news/detail-812914.html

 

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

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

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

相关文章

  • <数据结构> 链表 - 链表的概念及结构

    概念: 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的 逻辑顺序 是通过链表中的 指针链接 次序实现的 1、链表由一系列结点(链表中每一个元素称为结点)组成。 2、结点可以在运行时动态(malloc)生成。 3、每个结点包括两个部分:一个是存储数据元素的

    2023年04月09日
    浏览(46)
  • 【数据结构】二叉树的概念及结构

    🚀write in front🚀 📜所属专栏: 初阶数据结构 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对我最大的激励和支持!!! 关注我,关注我,关注我 , 你们将会看到更多的优质内容!! 树是一种 非线性的数据结构

    2023年04月23日
    浏览(44)
  • 【数据结构】树和二叉树的概念及结构

      树是一种非线性的数据结构,它是由n(n=0)个有限结点组成一个具有层次关系的集合。 把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 有一个 特殊的结点,称为根结点 ,根节点没有前驱结点。 除根节点外, 其余结点被分成M(M0)个互不相

    2024年02月13日
    浏览(39)
  • 【数据结构】树和二叉树的概念及结构(一)

    目录 一,树的概念及结构         1,树的定义         2,树结点的分类及关系         3,树的表示 二,二叉树的概念及结构         1,二叉树的定义         2,特殊的二叉树         3,二叉树的性质         4,二叉树的存储结构 1,顺序存储

    2024年02月10日
    浏览(45)
  • 爱上数据结构:栈和队列的概念及使用

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

    2024年04月16日
    浏览(31)
  • 数据结构(C语言实现)——二叉树的概念及二叉树顺序结构和链式结构的实现(堆排序+TOP-K问题+链式二叉树相关操作)

    前面学习了数据结构中线性结构的几种结构,顺序表,链表,栈和队列等,今天我们来学习一种非线性的数据结构——树。由于二叉树是数据结构中的一个重点和难点,所以本文着重介绍二叉树的相关概念和性质,以及二叉树的应用。 树是一种非线性的数据结构,它是由n(

    2023年04月21日
    浏览(45)
  • 数据结构从入门到精通——排序的概念及运用

    排序是将数据按照一定规则重新排列的过程,常见规则有升序、降序等。排序算法如冒泡排序、快速排序等,广泛用于数据库、搜索引擎等场景,提高数据检索效率。此外,排序也应用于统计分析、机器学习等领域,以获取有序数据集或发现数据间的关联。 排序是一种将一组

    2024年03月21日
    浏览(40)
  • 数据结构 | 二叉树的概念及前中后序遍历

    下面内容来自百度百科 二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能

    2024年02月05日
    浏览(37)
  • 【树与二叉树】二叉树顺序结构实现以及堆的概念及结构--详解介绍

    ​ ​📝个人主页:@Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:数据结构 🎯 长路漫漫浩浩,万事皆有期待 普通二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而 完全二叉树适合使用顺序结构存储 。现实中我们通常把 堆

    2023年04月24日
    浏览(42)
  • 【数据结构】栈的实现

    栈:是一种受限制的线性表,即只能在尾部进行插入、删除的线性表,而且是一种先进后出的数据结构。尾部这一端又叫做栈顶,另一端叫做栈底。 入栈:向一个栈内插入元素叫做入栈或压栈,它把新元素放到栈顶元素的上面,是它成为新的栈顶元素。 出栈:在栈内删除元

    2024年02月01日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包