数据结构学习之堆栈的链式存储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
原创粉丝点击