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++数据结构——链栈的实现 的相关文章

  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 使用 C# 读取 Soap 消息

  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • 绕过圆括号过滤实现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