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 ...
随机推荐
- The Game Of Life – 数据结构与算法的敲门砖
The Game Of Life(生命游戏,又称为细胞自动机)几乎是所有数据结构与算法导论教程前言的一个很经典的程序了.这是一个零玩家游戏,发生在一个平面网格里.每个格子的细胞都有死亡和存活两种状态, ...
- SpringBoot图文教程17—上手就会 RestTemplate 使用指南「Get Post」「设置请求头」
有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1-Spr ...
- 标题 发布状态 评论数 阅读数 操作 操作 CNN目标检测系列算法发展脉络简析——学习笔记(三):Fast R-CNN
最近两周忙着上网课.投简历,博客没什么时间写,姑且把之前做的笔记放上来把... 下面是我之前看论文时记的笔记,之间copy上来了,内容是Fast R-CNN的,以后如果抽不出时间写博客,就放笔记上来( ...
- 文件合并cat and paste
cat 纵向合并 cat file1 file 2 paset横向合并 wc用法 sort用法
- Linux常用命令总结(一)
一.cd命令 用于切换当前目录,类似与win的命令.它可以切换到绝对路径,也可以是相对路径. cd /root/Doce # 切换到绝对路径/root/Doce目录下 cd ./path # 切 ...
- [C#] 命令总线模式
1 高内聚.低耦合 虽然已经毕业很多年了,但依然总是能记得,<软件工程>这门课的老师总是强调 "高内聚,低耦合". 这些年,在架构方面的技术发展方向,目标就是不断的拆分 ...
- CF1324A Yet Another Tetris Problem 题解
原题链接 简要题意: 再简要一波: 每次可以把一个数增加 \(2\),问最后能不能让所有数相等.(也就是抵消掉) 什么?题意变成这样子还做个啥? 你会发现,必须所有数的奇偶性都相同,才可以:反之就不可 ...
- 快速排序-无序数组K小元素
13:07:382020-03-10 11:16:13 问题描述: 找到一个无序数组中第K小的数 样例 1: 输入: [3, 4, 1, 2, 5], k = 3 输出: 3 样例 2: 输入: [1 ...
- 动态网站项目(Dynamic Web Project)CRUD(增删改查)功能的实现(mvc(五层架构)+jdbc+servlet+tomcat7.0+jdk1.8),前端使用JSP+JSTL+EL组合
代码分享链接 https://pan.baidu.com/s/1UM0grvpttHW9idisiqa6rA 提取码:hx7c 图示 项目结构 1.SelectAllUser ...
- ASP.NET MVC升级到ASP.NET Core MVC踩坑小结
写在前面 ASP.NET Core是微软新推出的支持跨平台.高性能.开源的开发框架,它的优势不必多说,因为已经说得太多了.当然,现在依然有着数量庞大的系统运行于.NET Framework上,由于有大 ...