【数据结构与算法】栈的讲解

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

【数据结构与算法】栈的讲解

一.栈的定义

1.栈的定义

栈(stack)是限定仅在表尾进行插入和删除操作的线性表。

我们把允许插入和删除的一段称为栈顶(top),另一端称为栈底不含任何数据元素的栈称为空栈栈又称为后进先出的线性表
进一步理解栈,栈首先他是一个线性表,所以栈元素具有前驱后继关系。
栈的插入操作叫做出栈也叫压栈入栈栈的删除操作叫做出栈,也叫弹栈

2.进栈出栈变化形式

在进一步了解数据进栈和出栈后,有个问题----最先进栈的元素,是不是就只能是最后出栈呢。
其实不然,举例子来说现在有3个整形数字元素1、2、3依次进栈,会有那些序列呢?

  1. 第一种:1、2、3进,再3、2、1出。这是最简单最好理解的一种,出栈次序为3、2、1。

  2. 第二种:1进,1出,2进,2出,3进,3出。也就是进一个就出一个,出栈次序为1、2、3。

  3. 第三种:1进,2进,2出,1出,3进,3出。出栈次序为2、1、3。

  4. 第四种:1进,1出,2进,3进,3出,2出。出栈次序为1、3、2。

  5. 第五种:1进,2进,2出,3 进,3出,1出。出栈次序为2、3、1。

有没有可能是3、1、2这样的次序出栈呢?答案是肯定不会。因为3先出栈,就意味着,3曾经进栈,既然3都进栈了,那也就意味着,1和2已经进栈了,此时,2一定是在1的上面,就是更接近栈顶,那么出栈只可能是3、2、1,不然不满足1、2、3依次进栈的要求,所以此时不会发生1比2先出栈的情况。
从这个简单的例子就能看出,只是3个元素,就有5种可能的出栈次序如果元素数这个知识点一定要弄明白。

二.栈的抽象数据类型

对于栈来说,理论上线性表的操作特性他都具备,下面我们来看一下几个需要实现的功能;

typedef int STDataType;



typedef int STDataType;
void InitST(ST* s);//初始化栈
void DestroyST(ST* s);//销毁栈

void Push(ST* s, int x);//压栈
void Pop(ST* s);//出栈

bool STEmpty(ST* s);//判断栈是否为空栈
STDataType STSize(ST* s);//当前栈的元素个数
STDataType STTop(ST* s);//返回栈顶元素

三.栈的顺序储存结构及实现

1.栈的顺序存储结构

栈既然是线性表的特例,那么栈的顺序存储其实也是线性表顺序存储的简化,我们简称为顺序栈

typedef int STDataType;

typedef struct stack
{
	STDataType* a;
	STDataType top;//表示当前指向的元素下标
	STDataType capacity;//栈的当前容量
}ST;

(1).初始化栈

在初始化栈是指针a需要malloc个初始空间,容量则根据malloc的个数赋值。而top对的初值则有所不同,top的初值有两种情况 一是top代表下一个元素的下标二是代表当前元素的下标,两种不同的初值,也会影响后面操作的差别。

void InitST(ST* s)
{
	assert(s);
	s->a = (STDataType*)malloc(sizeof(STDataType) * 4);
	if (s->a == NULL)
	{
		perror("malloc fail");
		return;
	}

	s->capacity = 4;
	s->top = -1;///top记录指向的当前元素
}

(2).销毁栈

销毁栈则非常简单:

void DestroyST(ST* s)
{
	assert(s);
	s->capacity = 0;
	free(s->a);
	s->a = NULL;
	s->top = -1;
}

(3).进栈操作

进栈操作也比前面的顺序表链表的插入操作更为简单:

void Push(ST* s,int x)
{
	assert(s);

	if (s->top+1 == s->capacity)
	{
		s->a = (STDataType*)realloc(s->a,sizeof(STDataType)*s->capacity*2);
		if (s->a == NULL)
		{
			perror("malloc fail");
			return;
		}
		s->capacity *= 2;
	}
	s->a[s->top+1] = x;
	s->top++;

}

(4).出栈操作

出栈操作同样简单,知识需要提前检查当前是否为空栈即可:文章来源地址https://www.toymoban.com/news/detail-404491.html

void Pop(ST* s)
{
	assert(s);
	assert(!STEmpty(s));

	s->top--;
}

bool STEmpty(ST* s)
{
	assert(s);
	if (s->top == -1)
		return true;
	return false;
}

(5).栈的元素个数和栈顶元素

STDataType STSize(ST* s)
{
	assert(s);

	return s->top + 1;
}

STDataType STTop(ST* s)
{
	assert(s);

	return s->a[s->top];
}

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

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

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

相关文章

  • 【数据结构】顺序栈和链栈的基本操作(定义,初始化, 入栈,出栈,取栈顶元素,遍历,置空)

    🎊专栏【数据结构】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【勋章】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰   目录 ⭐栈的分类 ✨顺序栈 🎈优点: 🎈缺点: ✨链栈 🎈优点: 🎈缺点: ⭐基本概念 ✨栈: ✨栈顶: ✨栈顶: ✨图片理

    2023年04月22日
    浏览(56)
  • 头歌(C语言)-数据结构与算法-栈的实现-第1关:实现一个顺序存储的栈

    任务描述 相关知识 栈的基本概念 栈结构的定义(C) 顺序栈的操作 编程要求 测试说明 任务描述 本关任务是实现 step1/SeqStack.cpp 中的 SS_IsFull 、 SS_IsEmpty 、 SS_Length 、 SS_Push 和 SS_Pop 五个操作函数,以实现判断栈是否为满、是否为空、求栈元素个数、进栈和出栈等功能。 相关

    2024年02月07日
    浏览(65)
  • 北京林业大学数据结构实验二 基于栈的算术表达式求值算法

    参见课本P75 例3.3

    2024年02月06日
    浏览(48)
  • 【数据结构与算法】6、栈(Stack)的实现、LeetCode:有效的括号

    🌱 栈 是一种特殊的线性表, 只能在一端进行操作 🌱 往栈中 添加 元素的操作,一般叫做 push ( 入栈 ) 🌱 从栈中 移除 元素的操作,一般叫做 pop ,出栈(只能移除栈顶元素),也叫做: 弹出栈顶元素 🌱 后进先出 的原则, L ast I n F irst O ut, LIFO 注意:这里的 栈 与内

    2024年02月13日
    浏览(39)
  • 青岛大学_王卓老师【数据结构与算法】Week05_06_栈的顺序表示_学习笔记

    本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享, 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–第05周06–3.3栈的表示和实现2–3.

    2024年02月16日
    浏览(57)
  • 青岛大学_王卓老师【数据结构与算法】Week05_08_顺序栈的操作2_学习笔记

    本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享, 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–第05周08–3.3栈的表示和实现4–3.

    2024年02月16日
    浏览(92)
  • C++数据封装以及定义结构的详细讲解鸭~

    名字:阿玥的小东东   博客主页:阿玥的小东东的博客_CSDN博客-pythonc++高级知识,过年必备,C/C++知识讲解领域博主 目录 定义结构 访问结构成员 结构作为函数参数

    2024年02月04日
    浏览(43)
  • 数据结构:图及相关算法讲解

    概念多,但是不难理解,难的算法部分基本都是图解。 图是由顶点集合及顶点间的关系组成的一种数据结构:G = (V, E),其中 V为顶点集合,E为边集合 。 顶点和边 :图中结点称为顶点,第i个顶点记作vi。两个顶点vi和vj相关联称作顶点vi和顶点vj之间有一条边,图中的第k条边

    2024年03月12日
    浏览(39)
  • 数据结构与算法分析 第六章 图 作业讲解

     参考教材: 《数据结构(C语言版 第2版)》 严蔚敏,李冬梅,吴伟民编著,人民邮电出版社,2022年版。 截图未标明出处均为原创或取自《数据结构(C语言版 第2版)》~   本文对应的作业题讲解视频:   数据结构与算法分析作业讲解视频合集 https://www.bilibili.com/video/BV1N

    2024年02月03日
    浏览(47)
  • 【数据结构与算法】二叉树的知识讲解

    目录  一,二叉树的结构深入认识  二,二叉树的遍历  三,二叉树的基本运算 3-1,计算二叉树的大小 3-2,统计二叉树叶子结点个数 3-3,计算第k层的节点个数 3-4,查找指定值的结点         二叉树是不可随机访问的,二叉树的结构是通过双亲结点与孩子结点之间的连接进

    2024年02月08日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包