C++数据结构——链栈的实现

2023-10-29

链栈的实现,其实是针对栈的元素的个数变化量很大的一种情况,使用数组的话有可能造成很大的数组浪费空间,这时使用链栈来动态伸长链栈就变得很优秀了


节点结构

#pragma once
template<typename T>
class Node {
public:
    T data;
    Node<T>  *next;
};

类模板:

#pragma once
#include<iostream>
#include"Node.h"
using namespace std;

template<typename T>
class Stack {
public:
    Stack();
    ~Stack();     
    bool Push(T x);    //元素入栈
    bool pop(T &element);      //栈顶元素出栈
    bool Getpop(T &element) { if (top != NULL) { element = top->data; return true; } return false; } //获取栈顶元素
    bool Empty() { return top == NULL ? true : false; }   //判空
private:
    Node<T> *top;
};


template<typename T>
Stack<T>::Stack() {
    top = NULL;
}
template<typename T>
Stack<T>::~Stack() {
    while (top->next!=NUll) {
        Node<T> *temp = top;
        top = top->next;
        delete temp;
        temp = NUll;
    }
    delete top;
    top = NULL;
}
template<typename T>
bool Stack<T>::pop(T &element) {
    if (top == NULL) {
        cout << "当前栈为空,无法再出栈" << endl;
        return false;
    }
    else {
        Node<T> *temp = top;
        element= temp->data;
        top = top->next;
        delete temp;
        temp = NULL;
        return true;
    }
}
template<typename T>
bool Stack<T>::Push(T x) {
    Node<T> *s = new Node<T>;
    if (s==NULL) {
        return false;    //内存申请失败,返回
    }
    s->data = x;
    s->next = top;
    top = s;
    return true;
}

代码简单测试:

#include<iostream>
#include"Stack.h"
using namespace std;

void popStack(Stack<int> *MyStack);
void getpop(Stack<int> *MyStack);
int main() {
    Stack<int> *MyStack=new Stack<int>;
    int element = 0;
    getpop(MyStack);
    if (MyStack->Empty()) {
        cout << "当前栈空" << endl;
    }
    else {
        cout << "当前栈不为空" << endl;
    }
    /*入栈入五个元素,先入的元素会到栈底,最后入的元素会在栈顶*/
    MyStack->Push(1);         
    MyStack->Push(2);
    MyStack->Push(3);
    MyStack->Push(4);
    MyStack->Push(5);
    popStack(MyStack);
    if (MyStack->Empty()) {
        cout << "当前栈空" << endl;
    }
    else {
        cout << "当前栈不为空" << endl;
    }
    popStack(MyStack);
    popStack(MyStack);
    popStack(MyStack);
    popStack(MyStack);
    getpop(MyStack);
    return 0;
}

void popStack(Stack<int> *MyStack) {
    int element;
    if (MyStack->pop(element))
    {
        cout << "当前出栈元素为:" << element << endl;
    }
    else {
        cout << "当前栈为空,无法再出栈" << endl;
    }
}
void getpop(Stack<int> *MyStack) {
    int element;
    if (MyStack->Getpop(element)) {
        cout << "栈顶元素为:" << element << endl;
    }
    else {
        cout << "当前栈为空,所以无栈顶元素!" << endl;
    }
}

结果:

程序代码页面
总结:当栈中的元素个数变化不大时,我们应该使用顺序栈(因为使用链栈时多出来的一个指针域也会浪费空间)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++数据结构——链栈的实现 的相关文章

随机推荐

  • 绕过圆括号过滤实现XSS弹框

    用data协议
  • 思科实验9.网络层:PPP协议配置

    PPP协议配置 基础知识 常用命令 实验流程 目的 1 设计拓扑 2 配置主机IP地址 3 配置路由器 4 设置PPP协议 5 验证主机连通 基础知识 PPP协议即点对点协议 是在点对点连接上传输多协议数据包提供了一个标准方法 是一种点到点
  • 算法进阶指南:0x18:双栈排序

    Tom 最近在研究一个有趣的排序问题 通过 2 个栈 S1 和 S2 Tom 希望借助以下 4 种操作实现将输入序列升序排序 操作 a 如果输入序列不为空 将第一个元素压入栈 S1 操作 b 如果栈 S1 不为空 将 S1 栈顶元素弹出至输
  • uboot下内存操作mw和md命令详解

    mw简介 u boot 中的 mw 命令是用于向内存写入数据的命令 它有4种形式 mw b 写入 1 个字节 8 比特 的数据 mw w 写入 1 个字 2 字节 16 比特 的数据 mw l 写入 1 个长字 4 字节 32 比特 的数据
  • Redis 学习笔记2:redis.conf配置文件详解

    Redis 的配置文件位于 Redis 安装目录下 文件名为 redis conf 参数说明 参数说明 redis conf 配置项说明如下 1 Redis默认不是以守护进程的方式运行 可以通过该配置项修改 使用yes启用守护进程 daem
  • 阻抗匹配之反射波形测量

    稍微接触过高速信号的朋友 一定对阻抗匹配和信号反射都有所了解 甚至可以按照公式 把反射波形一路推导出来 但是 纸上得来终绝浅 绝知此事要躬行 今天 我们就来实测一下信号反射波形 测试环境如下 信号发生器产生一个1 25MHz VPP 2V的
  • 数据库连接池(C++11实现)

    目的 因为对数据库的操作实质上是对磁盘的IO操作 所以如果对数据库访问次数过多 就会到导致大量的磁盘IO 为了提高MySQL数据库 基于C S设计 的访问瓶颈 除了在服务器端增加缓存服务器缓存常用的数据 之外 例如Redis 还可以增加连接
  • [POJ1088] 滑雪(递归dp)

    Description Michael喜欢滑雪百这并不奇怪 因为滑雪的确很刺激 可是为了获得速度 滑的区域必须向下倾斜 而且当你滑到坡底 你不得不再次走上坡或者等待升降机来载你 Michael想知道载一个区域中最长底滑坡 区域由一个二维数组
  • yolov5 6.0运行

    1 github下载yolov5 6 0代码 下载链接 2 利用Anaconda安装所需环境参考 如何配置pytorch 3 在pycharm打开文件并选择配置好的环境编译器 4 安装所需模块 利用作者提供的requirements txt
  • linux系统编程(七)进程

    文章目录 1 进程 1 1 进程相关概念 1 1 1 程序和进程 1 1 2 并发 1 1 3 单道程序设计 1 1 4 多道程序设计 1 1 5 CPU和MMU 1 1 6 进程控制块PCB 1 1 7 进程状态 1 2 环境变量 1 2
  • opencv条码(4)图像的flip之图形化界面

    flip函数可以实现图像反转 这里贴出mainwindow cpp的内容吧 书上的代码对应opencv2 2现在有些不能用了请注意 include mainwindow h include ui mainwindow h using nam
  • 华为OD机试 - 最小循环子数组(Java)

    题目描述 给定一个由若干整数组成的数组nums 请检查数组是否是由某个子数组重复循环拼接而成 请输出这个最小的子数组 输入描述 第一行输入数组中元素个数n 1 n 100000 第二行输入数组的数字序列nums 以空格分割 0 nums i
  • Java架构直通车——理解Tomcat架构设计

    文章目录 引入 Socket与SeverSocket 一个简单Web容器设计与实现 理解Tomcat架构设计 什么是Servlet Tomcat Servlet容器 引入 Socket与SeverSocket Socket Socket是网
  • SpringBoot整合Logback日志框架配置全解析

    一 Logback日志框架介绍 SpringBoot使用 Commons Logging 进行所有内部日志的记录 但默认配置也提供了对常用日志的支持 如 Java Util Logging Log4J2 和Logback 每种logger都
  • npm install node-sass的时候报错ERR gyp ERR C++

    今天在项目里执行npm i命令的是后报错一大片 搜了很多文章 都没有到点上 突然灵感一闪 可能是电脑上没有c 编译环境的问题 但是是我在电脑上运行c文件是正常的 搜到一篇文章里写的情况是这样的 npm分发的都是源码 npm install的
  • oracle如何得到32位的世界唯一随机数

    author skate time 2008 2 18 oracle如何得到32位的世界唯一随机数 我们在创建表的时候一般都用序列生成的数字来保证数据的唯一 但这只能保证在单个实例中 无法适合并行或远程的环境的主关键字 因为在各自环境理里可
  • 数据库基本概念、ubuntu安装MySQL

    安装MySQL参考了这篇博客 Ubuntu18 04 安装MySQL SQL创建表格 添加元组 MySQL创建数据库 需要创建的student和course表 进入sql前要先进入root用户 创建数据库 加分号代表结束语句 在数据库中建表
  • 阿里云通过全球加速实现IPv6地址转换

    购买全球加速实例和基础带宽包 打开 全球加速 先配置基础带宽包 点击实例 点击 加速区域 选择 添加接入地域 去配置监听 在 加速区域 复制 加速IP 到指定的DNS云解析处 添加AAAA记录 测试 开启手机热点 笔记本连上热点 取消属性里
  • 文件操作总结

    文章目录 一 文件三大核心内容 1 1打开文件 1 2读写操作 1 3关闭文件 二 文件基本知识点 2 1操作系统是以文件为单位对数据进行管理 2 2数据流 2 3文件路径 2 4文件打开方式 2 5文件缓存 2 6在 cpp文件中的读写模
  • C++数据结构——链栈的实现

    链栈的实现 其实是针对栈的元素的个数变化量很大的一种情况 使用数组的话有可能造成很大的数组浪费空间 这时使用链栈来动态伸长链栈就变得很优秀了 节点结构 pragma once template