C++语言实现链式栈
在之前写的C语言实现链式栈篇博文中,我已经给大家大概介绍了关于链式栈的意义以及相关操作,我会在下面给大家分享百度百科对链式栈的定义,以及给大家介绍利用C++实现链式栈的基本操作。
百度百科链式栈
链式栈是一种数据存储结构,可以通过单链表的方式来实现,使用链式栈的优点在于它能够克服用数组实现的顺序栈空间利用率不高的特点,但是需要为每个栈元素分配额外的指针空间用来存放指针域。
栈是只能在某一端插入和删除的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底(push),最后的数据在栈顶(top),需要读数据的时候从栈顶开始弹出数据(top)最后一个数据被第一个读出来。链式栈中的元素以Node的形式存储,节点Node中存有此节点存于栈中的元素以及指向下个节点的指针。链式栈的数据成员只用保存指向栈顶节点的指针 *top_node。
顺序栈的实现在于使用了数组这个基本数据结构,数组中的元素在内存中的存储位置是连续的,且编译器要求我们在编译期就要确定数组的大小,这样对内存的使用效率并不高,一来无法避免因数组空间用光而引起的溢出问题,二在系统将内存分配给数组后,则这些内存对于其他任务就不可用;而对于链栈而言,使用了链表来实现栈,链表中的元素存储在不连续的地址,由于是动态申请内存,所以我们可以以非常小的内存空间开始,另外当某个项不使用时也可将内存返还给系统。
C++实现链式栈
利用C++语言实现了数据结构的链式栈,主要完成了以下操作:
链式栈的 | 基本操作 |
---|---|
元素进栈 | 元素出栈 |
返回栈顶元素 | 判断栈是否为空 |
打印栈的元素 |
链式栈的结点
链式栈的结点其实跟链式结构的顺序结构差不多类似,包含两部分,一是储存数据的数据域,二是储存下一结点地址的指针域,因此以结构体封装的结点如下:
template <class T>
struct chainStackNode
{
T data;//链式栈储存结点的数据
chainStackNode<T> *next;//链式栈指向下一结点的指针
};
链式栈的基本操作
在写这次链式栈的时候,我在所有的函数实现前都加上了inline,在这里给大家解释一下。inline是C++关键字,在函数声明或定义中,函数返回类型前加上关键字inline,即可以把函数指定为内联函数。这样可以解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题。关键字inline必须与函数定义放在一起才能使函数成为内联函数,仅仅将inline放在函数声明前面不起任何作用。inline是一种“用于实现”的关键字,而不是一种“用于声明”的关键字。
构造函数
构造函数,就是实现成员的初始化操作,当然在这里实现链式栈的初始化就只需要创建一个头指针,并初始化头指针的各个成员。
template <class T>
inline chainStack<T>::chainStack()
{
top = new chainStackNode<T>;//创建一个新的结点
top->next = NULL;//将top的next指针指向空
}
元素进栈
链式栈的进栈操作,顾名思义就是一个新的元素进入栈,当然首先要创建一个新的结点,然后就是将这个新的结点插入到栈顶,只需要调整来两个指针操作。
template <class T>
inline bool chainStack<T>::Push(T newData)
{
chainStackNode<T> *newNode = new chainStackNode<T>;
if(!newNode){
cout<<"分配内存失败!"<<endl;
return false;
}
newNode->data = newData;//修改指针,添加元素
newNode->next = top->next;
top->next = newNode;
return true;
}
元素出栈
元素出栈,就跟线性表的删除元素类似,不过只能删除顶部结点,这个栈的特性是不可以违背的,调整指针删除结点之后不要忘了释放删除的结点的内存。
template <class T>
inline bool chainStack<T>::Pop(T &x)
{
chainStackNode<T> *temporaryNode;//创建一个临时指针指向删除结点
if(isEmpty() == true){
cout<<"该栈为空!"<<endl;
return false;
}
else
{
temporaryNode = top->next;
x = temporaryNode->data;//以引用返回
top->next = temporaryNode->next;
delete temporaryNode;//释放空间
return true;
}
}
返回栈顶元素
返回栈顶的元素,判断栈是否为空,如果为空自然没有元素可以返回,否则就返回top指向的下一个结点的数据即可。
template <class T>
inline bool chainStack<T>::getTop(T &x)
{
if(isEmpty() == true){
return false;
}
else{
x = top->next->data;
return true;
}
}
判断栈是否为空
有了top指针,就只需要判断top指针的下一结点是否为空即可。
template <class T>
inline bool chainStack<T>::isEmpty()
{
if(top->next == NULL){//top指针的下一结点是否为空,以此来判断是否为空
return true;
}
else{
return false;
}
}
打印栈的元素
打印栈的元素,就是一个遍历的过程,定义一个指针,输出结点数据,调整指针位置。
template <class T>
inline void chainStack<T>::printChainStackData()
{
chainStackNode<T> *pMove;
pMove = top->next;
while(pMove->next != NULL){
cout<<"["<<pMove->data<<"]->";
pMove = pMove->next;
}
cout<<"["<<pMove->data<<"]"<<endl;
}
到这里,利用C++语言实现链式栈的介绍就已经结束了,如果有哪里写的不好的地方,还希望大家给我提出了,我加以修正,完整的代码包括测试代码我已经push到了githubC++实现链式栈,另外如果大家还想了解其他的内容,欢迎来我的博客,我们一起讨论,共同进步!
C++语言实现链式栈的更多相关文章
- C语言数据结构-链式栈的实现-初始化、销毁、长度、取栈顶元素、查找、入栈、出栈、显示操作
1.数据结构-链式栈的实现-C语言 //链式栈的链式结构 typedef struct StackNode { int data; struct StackNode *next; } StackNod ...
- go语言实现链式栈
haa哈哈== import "errors" var ( // ErrEmpty 栈为空 ErrEmpty = errors.New("stack is empty&q ...
- C语言链表全操作(增,删,改,查,逆序,递增排序,递减排序,链式队列,链式栈)
一,数据结构——链表全操作: 链表形式: 其中,每个节点(Node)是一个结构体,这个结构体包含数据域,指针域,数据域用来存放数据,指针域则用来指向下一个节点: 特别说明:对于单链表,每个节点(Nod ...
- 栈(链式栈)----C语言
链式栈:就是一种操作受限的单向链表,对单向链表还不了解的可先看一下之前的一篇关于单向链表的随笔,链表(单向链表的建立.删除.插入.打印),理解了单向链表后再来看链式栈就比较轻松了 链式栈的操作一般含有 ...
- 链式栈-C语言实现
相对于顺序栈的空间有限,链式栈的操作则更加灵活 #include<stdio.h> #include<malloc.h> typedef int SElemType; //元素 ...
- C++学习(三十七)(C语言部分)之 链式栈(推箱子实现)
用链表实现栈一开始在表头插入,就要一直在表头插入一开始在表尾插入,就要一直在表头插尾表头当栈底 也可以把表尾当栈底 实现的测试代码笔记如下: #include<stdio.h> #incl ...
- 传智播客C语言视频第二季(第一季基础上增加诸多C语言案例讲解,有效下载期为10.5-10.10关闭)
卷 backup 的文件夹 PATH 列表卷序列号为 00000025 D4A8:14B0J:.│ 1.txt│ c语言经典案例效果图示.doc│ ├─1传智播客_尹成_C语言从菜鸟到高手_第一 ...
- 传智播客C语言视频第一季(有效下载期为10.1-10.7,10.8关闭)
J:\传智播客_尹成_C语言从菜鸟到高手├─传智播客_尹成_C语言从菜鸟到高手_第一章C语言概述A│ 第一讲1.1C语言第一阶段.mp4│ 第二讲1.2c语言入门教程.mp4 ...
- [数据结构]C语言栈的实现
有始有终,所以我准备把各种数据结构都讲一次,栈也分顺序存储和链式储存,这里我们选择链式存储来讲,顺序存储没有难度(链式其实也是) 作为数据结构中最简单的栈,这里不会说太多,首先考虑一下下面的model ...
随机推荐
- javascript 自动选中容器里的文字
前些时间有这么个需求,需要实现选中div里面的文字,选中了的文字可直接按ctrl+v(或者右键)实现黏贴操作. html代码: <div id="text" class=&q ...
- Angular 从入坑到挖坑 - HTTP 请求概览
一.Overview angular 入坑记录的笔记第四篇,介绍在 angular 中如何通过 HttpClient 类发起 http 请求,从而完成与后端的数据交互. 对应官方文档地址: Angul ...
- 998. 最大二叉树 II
最大树定义:一个树,其中每个节点的值都大于其子树中的任何其他值. 给出最大树的根节点 root. 就像之前的问题那样,给定的树是从表 A(root = Construct(A))递归地使用下述 Con ...
- 从原子类和Unsafe来理解Java内存模型,AtomicInteger的incrementAndGet方法源码介绍,valueOffset偏移量的理解
众所周知,i++分为三步: 1. 读取i的值 2. 计算i+1 3. 将计算出i+1赋给i 可以使用锁来保持操作的原子性和变量可见性,用volatile保持值的可见性和操作顺序性: 从一个小例子引发的 ...
- docker安装mysql主从
docker安装mysql主从 启动主库: 1.docker run --name master -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5 ...
- jviisualvm监控远程主机java程序实战与问题排查
1.远程主机运行jstatd 首先新建文件 jstatd.all.policy ,内容如下 grant codebase "file:${java.home}/../lib/tools.ja ...
- Linux常用命令 - cat命令详解
21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 获取t ...
- OpenCV-Python 鼠标作画 | 八
目标 了解如何在OpenCV中处理鼠标事件 您将学习以下功能:cv.setMouseCallback() 简单演示 在这里,我们创建一个简单的应用程序,无论我们在哪里双击它,都可以在图像上绘制一个圆. ...
- TensorFlow v2.0实现逻辑斯谛回归
使用TensorFlow v2.0实现逻辑斯谛回归 此示例使用简单方法来更好地理解训练过程背后的所有机制 MNIST数据集概览 此示例使用MNIST手写数字.该数据集包含60,000个用于训练的样本和 ...
- Soldier and Number Game CodeForces - 546D 素因子数打表(素数筛的改造)
题意: 输入 a 和 b(a>b),求a! / b!的结果最多能被第二个士兵给的数字除多少次. 思路: a! / b!肯定能把b!约分掉,只留下b+1~a的数字相乘,所以我们求b+1 ~ a的所 ...