数据结构学习之堆栈的链式存储C++实现
来源:互联网 发布:旺旺名是淘宝名吗 编辑:程序博客网 时间:2024/06/18 14:43
最近一直在中国大学MOOC网上选修了浙江大学的《数据结构》课程。第二周的课程讲了线性表、堆栈和队列三种抽象数据类型。接下来三篇博客就这三种抽象数据类型进行总结和描述,并贴出C++实现的结构和主要的操作函数。堆栈。
一、堆栈的抽象数据类型描述
任何一种抽象数据类型的描述主要分为数据对象集和操作集两部分。
1、数据对象集:一个有0个或者多个元素的有穷线性表。(堆栈本质上一种线性表)
2、操作集:(1)生成一个空堆栈,返回其指针(2)判断堆栈是否为空 (3)元素入栈和出栈
3、重要特性:后入先出(后加入堆栈的元素先被弹出)
二、主要操作函数的C++实现
1、数据结构实现,struct
//堆栈指针和节点指针的声明typedef struct SNode* Stack;//堆栈节点结构体定义struct SNode{int data;struct SNode *Next;};因为堆栈本质上是一种线性表,所以数据结构的定义和线性表一致。此处Stack可以是一个堆栈的指针,也可以是一个堆栈节点的指针。
2、创建一个空堆栈,并返回堆栈指针
//操作函数1: 创建一个空的堆栈并初始化//功能: 创建一个堆栈的头节点并返回指针//链表的第一个头节点并不存储数据,只是当做头节点,为整个堆栈的指针Stack CreateStack(){Stack PtrS;PtrS = (Stack) new (struct SNode);PtrS->Next=NULL;return PtrS;}因为堆栈本质上是一种线性表,所以初始化和线性表一致。需要注意的也一样。
3、判断堆栈是否为空
//操作函数2: 判断堆栈是否为空//功能: 判断堆栈是否为空int IsEmpty(Stack PtrS){if(PtrS->Next==NULL)return 1;elsereturn 0;}根据堆栈指针的Next指针是否为NULL判断堆栈是否为空。
·4、入栈操作
//操作函数3: 入栈操作//功能: 将一个元素压入堆栈//注意: 堆栈的Top在链表的头上void Push(int data, Stack PtrS){SNode *TmpCell;TmpCell=(Stack)new (struct SNode);//开辟内存TmpCell->data=data;TmpCell->Next =PtrS->Next;//新入栈节点的next指针指向原来的第一个节点PtrS->Next = TmpCell;//堆栈指针的Next指针指向刚入栈这个元素节点}特别注意:因为堆栈是一种后入先出的数据结构,入栈和出栈都必须在线性表的一端进行操作,所以堆栈的链式存储中堆栈的
top在链表的头。因为如果top设置在链表的头,入栈简单,但是出栈的时候,怎么定位到出栈节点的上一个节点呢,很麻烦。
5、出栈操作
//操作函数4: 出栈操作//功能: 将一个元素从堆栈弹出//注意: 堆栈的Top在链表的头上int Pop(Stack PtrS){SNode *FirstCell;int data;if(IsEmpty(PtrS))//判断是否为空{cout << "堆栈为空" << endl;return NULL;}else{FirstCell=PtrS->Next;//指向链表的第一个节点PtrS->Next= FirstCell->Next;//将Top下下个节点的指针付给Top节点的下节点的指针data=FirstCell->data;//将值取出delete FirstCell;//释放内存return data;}}
注意:堆栈中元素的出栈,很重要的一步是要判断堆栈是否为空,如果堆栈为空,没有元素,就不能弹出元素。
关于堆栈的链式存储特别需要注意理解的几点:
1、整个堆栈的第一个节点的指针为 PtrS->Next注意后面还有一个Next,因为PTRQ仅仅只指向线性表的头,线性表
头的Next指针所指的才是线性表的第一个元素节点,即堆栈的第一个元素节点。
2、每次入栈一个元素节点,在表的表头插入,即:表头指针的Next指向刚插入的元素节点。出栈也是一样在表头进行,在表头删除。
3、明白一点堆栈的本质也是一种线性表。
0 0
- 数据结构学习之堆栈的链式存储C++实现
- 数据结构学习之堆栈(链式存储)
- 数据结构:堆栈的链式存储实现
- 数据结构之堆栈的链式存储
- 数据结构学习之队列的链式存储的C++实现
- c 堆栈的链式存储
- 堆栈的链式存储实现
- 2.2.3 堆栈的链式存储实现
- JAVA版数据结构之栈的链式存储实现
- C/C++ 堆栈、队列的链式实现
- 数据结构C语言实现系列——链式堆栈
- 数据结构学习之队列(链式存储)
- 链式实现的堆栈
- 链式堆栈的实现
- 数据结构:二叉树的链式存储实现
- 数据结构学习之堆栈(顺序存储)
- 常用数据结构之链式存储的栈
- 数据结构之线性表的链式存储
- 深度学习中的数据增强方法
- P3376 网络最大流
- 设计模式--工厂模式(C++实现)
- 洛谷 1462 通往奥格瑞玛的道路
- 我的webpack,持续更新......
- 数据结构学习之堆栈的链式存储C++实现
- 【天梯赛】L1--003 map典型的简单应用
- 虚析构函数
- 自动扫雷机
- PackageManager解析
- 在Ubuntu Server 14.04 LTS下安装VMware Tools(解决与主机共享问题---Mac虚拟机
- Android动画 帧动画、补间动画、属性动画 (二)
- 【线上第一解决方案】intellij如何把source文件和resource文件同时发布, java文件编译到输出folder, resource复制到output folder
- 判断一个double数是否为整数