基于C++的栈的两种实现(数组和链表)

2023-11-02


概述

栈是一种只能在表的顶端进行插入和删除运算的线性表,其主要特点是后进先出(LIFO)或先进后出(FILO),该数据结构的示意图如下:

在这里插入图片描述


基本操作

函数名 用途
bool empty() 判断栈是否为空
int size(); 求栈的长度
int top() 求栈顶元素
void push(int data) 在栈顶插入元素
void pop() 从栈顶弹出元素
void display() 遍历打印栈元素

用数组实现栈

  1. 在“Stack_By_Array.h”文件中的代码如下:
class Stack1 {
private:
	int data[10];
	int length;

public:
	Stack1();
	~Stack1();

	bool empty();
	int size();
	int top();
	void push(int value);
	void pop();
	void display();
};

  1. 在“Stack_By_Array.cpp”文件中的代码如下:
#include<iostream>
#include"Stack_By_Array.h"

using namespace std;

Stack1::Stack1() {
	length = 0;
}

Stack1::~Stack1() {}

bool Stack1::empty() {
	return length == 0;
}

int Stack1::size() {
	return length;
}

void Stack1::push(int value) {
	if (length < 10) {
		data[length++] = value;
	}
	else {
		cout << "栈已满,无法继续添加元素。" << endl;
	}
}

int Stack1::top() {
	return data[length - 1];
}

void Stack1::pop() {
	length -= 1;
}

void Stack1::display() {
	if (length == 0) {
		cout << "栈为空!" << endl;
		return;
	}

	for (int i = length - 1; i >= 0; i--) {
		cout << data[i] << endl;
	}
	cout << "-------------------------------" << endl;
}

用链表实现栈

  1. 在"Stack_By_LinkedList.h"文件中的代码如下:
class Stack2
{
private:

    class Node
    {
    public:
        int data;
        Node* next;

        Node(int data, Node* next);
        ~Node();
    };

    Node* head;
    size_t length;

public:
    Stack2();
    ~Stack2();

    bool empty();
    int size();
    int top();
    void push(int data);
    void pop();
    void display();
};

  1. 在"Stack_By_LinkedList.cpp"文件中的代码如下:
#include<iostream>
#include"Stack_By_LinkedList.h"
using namespace std;


Stack2::Node::Node(int data, Node* next) {
    this->data = data;
    this->next = next;
}

Stack2::Node::~Node() {
}

Stack2::Stack2() {
    this->head = nullptr;
    this->length = 0;
}

Stack2::~Stack2() {
    while (this->head != nullptr) {
        Node* temp = this->head;
        this->head = this->head->next;
        delete temp;
    }
}

bool Stack2::empty() {
    return this->head == nullptr;
}

int Stack2::size() {
    return this->length;
}

int Stack2::top() {
    if (head != nullptr) {
        return this->head->data;
    }
}

void Stack2::push(int data) {

    Node* new_node = new Node(data, nullptr);
    new_node->next = head;
    head = new_node;
    this->length++;
}

void Stack2::pop() {
    if (head == nullptr) {
        return;
    }

    Node* p = head;
    head = head->next;
    delete p;
    this->length--;
}

void Stack2::display() {
    if (this->head == nullptr) {
        cout << "栈为空!" << endl;
        return;
    }

    Node* p = this->head;
    while (p != nullptr) {
        cout << p->data << endl;
        p = p->next;
    }
    cout << "-------------------------------" << endl;
}

测试

在"Stack Testing.cpp"中的代码如下:

#include<iostream>
#include"Stack_By_Array.h"
#include"Stack_By_LinkedList.h"

using namespace std;

void test_Stack_By_Array() {
	Stack1 stack;
    cout << "测试1:数组实现的栈:" << endl;
    cout << "---------------------------------" << endl;
    cout << "将1-6依次入栈后,打印栈元素如下:" << endl;
	for (int i = 1; i <= 6; i++) {
		stack.push(i);
	}
    stack.display();

    cout << "栈顶元素为:" << stack.top() << endl;
    cout << "-------------------------------" << endl;

    for (int i = 0; i < 2; i++) {
        stack.pop();
    }
    cout << "弹出两个元素后,栈元素如下:" << endl;
    stack.display();

    for (int i = 0; i < 4; i++) {
        stack.pop();
    }
    cout << "弹出所有元素后,栈内情况为:" << endl;
    stack.display();
}

void test_Stack_By_LinkedList() {
    Stack2* stack = new Stack2();
    cout << "测试2:链表实现的栈:" << endl;
    cout << "---------------------------------" << endl;
    cout << "将1-6依次入栈后,打印栈元素如下:" << endl;
    for (int i = 1; i <= 6; i++) {
        stack->push(i);
    }
    stack->display();

    cout << "栈顶元素为:" << stack->top() << endl;
    cout << "-------------------------------" << endl;

    for (int i = 0; i < 2; i++) {
        stack->pop();
    }
    cout << "弹出两个元素后,栈元素如下:" << endl;
    stack->display();

    for (int i = 0; i < 4; i++) {
        stack->pop();
    }
    cout << "弹出所有元素后,栈内情况为:" << endl;
    stack->display();

    delete stack;
}

int main() {
	test_Stack_By_Array();
    cout << endl;
    test_Stack_By_LinkedList();
	return 0;
}

输出结果如下:
在这里插入图片描述
可以看出,两中方法实现的数组功能完全一致。

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

基于C++的栈的两种实现(数组和链表) 的相关文章

  • Java 中的 TreeSet 与 C#.net 的等效项

    我有 Java 代码 其中包含TreeSet 我想将代码转换为 C 我可以使用哪个等效集合 如果没有 请提出替代方案 那将是系统 集合 通用 SortedSet
  • 异步回调到BackgroundWorker

    我想使用 NET FTP 库 http netftp codeplex com http netftp codeplex com 该库提供 BeginOpenRead string AsyncCallback object 使用异步编程模型
  • do { ... } while (0) — 它有什么用? [复制]

    这个问题在这里已经有答案了 我已经看到这个表情十多年了 我一直在努力思考它有什么好处 因为我主要在 defines 中看到它 所以我认为它对于内部作用域变量声明和使用中断 而不是 gotos 很有用 对其他方面有好处吗 你用它吗 这是 C
  • 如何直观理解C++优先级队列容器比较器中的大于/小于运算符

    我总是对为优先级队列容器定义比较器感到困惑 并且不知道如何理解它 例如 我有一个vector of pair
  • 安全地检查“this”是否为空

    首先 我知道在空指针上调用方法是未定义的行为 我还知道 因为这不应该发生 编译器可以 并且确实 假设this始终为非空 但在实际代码中 有时您会不小心这样做 通常 它没有任何不良影响 当然除了this方法中为 null 并且事情可能会崩溃
  • 如何在 VS 2013 的立即窗口中执行 LINQ 和/或 foreach?

    在调试过程中探测当前状态时 立即窗口是非常有用的工具 我了解到 通过使用问号 人们可以在那里做更多的事情 如图所示在这篇文章中 https stackoverflow com questions 32934635 execute metho
  • send() 使我的程序崩溃

    我正在运行服务器和客户端 我正在我的计算机上测试我的程序 这是服务器中向客户端发送数据的函数 int sendToClient int fd string msg cout lt lt sending to client lt lt fd
  • 隐藏树视图列表中的节点。在 C# 中

    我正在使用 VS 2005 C 正在处理一个未完成的 WinForm 我已将 XML 解析为树视图列表 但遇到了一些问题 我想知道是否有一种方法可以隐藏 过滤 删除名称中包含 this text 的某个节点 而不必依赖文本框 这就是我对这个
  • 重写 ASP.Net Core 中的 415 响应

    在 ASP net Core 2 1 中 我想返回 Json 响应以及状态代码 415 而不是默认返回的 415 为了实现这一点 我使用资源过滤器 public class MediaTypeResouceFilter Attribute
  • 为什么 ATOMIC_FLAG_INIT 为假?

    In C 11有std atomic flag这对于线程循环很有用 static std atomic flag s done ATOMIC FLAG INIT void ThreadMain while s done test and s
  • C# 如何在没有 GacUtil 的情况下在 GAC 中注册程序集?

    我需要使用批处理文件在 GAC 中注册程序集 有没有办法找到安装位置GacUtil exe或者有没有办法在没有 GacUtil 的情况下注册程序集 Your bestbet is to use a powershell script tha
  • 大表的最佳主键格式

    我正在开发一个 ASP NET 应用程序 它有一些可能很大的数据表 我想知道定义主键的最佳方法是什么 我知道以前已经有人问过这个问题 但由于这是针对特定情况的 所以我认为这个问题是有效的 我在 SQL Server 2008 数据库上使用实
  • const int 列表而不是 enum

    我开始研究大型 C 代码库 并发现使用带有多个 const ints 字段的静态类 这个类的行为与枚举完全一样 我想将类转换为实际的枚举 但权力被拒绝 我想转换它的主要原因是这样我可以将枚举作为数据类型而不是 int 这对可读性有很大帮助
  • std::regex 的行为不一致

    我有以下问题 std regex如果我传递结果 行为会有所不同boost filesystem path string vs 将结果存储在中间字符串变量中 第一个将返回一个被截断的匹配 并且稍后不被接受std stoull 抛出 inval
  • DateTimeFormat.AbbreviatedMonthNames 在月份名称末尾添加一个点

    昨晚 我们将 Web 服务层从物理 Windows 2008 r2 迁移到虚拟 Windows 2012 我们的日志中收到大量有关 DateTime 无效格式的事件 这很奇怪 因为我们仔细检查了区域设置 长话短说 CultureInfo G
  • 如何使 RSACryptoServiceProvider 在没有填充(nopadding)的情况下工作?

    我需要使 C 应用程序与 Java 应用程序兼容 Java 应用程序使用Cipher getInstance RSA ECB nopadding 初始化器使密码 ECB 和无填充 但是 在 C 中 您有 2 个填充选项 OAEP 填充或 P
  • 使用 C++20 概念避免 std::function

    过去 当我想要回调作为函数参数时 我通常决定使用std function 在极少数情况下 我绝对从不使用捕获 我使用了typedef改为函数声明 因此 通常我的带有回调参数的声明看起来像这样 struct Socket void on re
  • ASP .NET Core IIS 托管用户身份名称为空且 IsAuthenticated=false

    我在 IIS 上运行 ASP NET Core dll 使用 AspNetCoreModule 使用以前的 ASP NET 我可以通过以下方式获取用户身份名称 HttpContext Current User Identity Name 因
  • 是一对一的关系不好的策略

    用户始终拥有一个钱包 一个钱包始终属于一位用户 由于我想分离与钱夹相关的属性 我创建了 Wallet 对象并能够跟踪钱交易 我创建了 public Wallet Entity
  • Microsoft Graph API 调用无限期挂起

    我正在尝试使用 Microsoft Graph 查询 Azure Active Directory 用户信息 我可以很好地进行身份验证 但是当我尝试查询用户信息时client Users我的应用程序无限期挂起 没有超时 没有错误 只是挂起

随机推荐

  • 关于影视后期制作的就业市场调查报告

    关于影视后期制作的就业市场调查报告 21电商王绮悦 目 录 一 简介及发展前景 二 技能要求 三 工作内容 四 用人单位类型 五 发展路径及其所需具体技能 六 行业优势 七 行业劣势 八 自身分析 九 对暑期实践的规划 十 学习材料 十一
  • 2023暑期实习历程总结

    一 前言 Hello 大家好久不见 已经三个月左右没有更新了 那我这三个月在干什么呢 自2023年3月中旬开始到现在五月底这期间接近三个月的时间里 我一直在进行2023暑期实习的投递和面试 这期间投递了包括各大中厂 阿里 腾讯 蚂蚁 美团
  • Jmter的安装及使用

    Jmter的安装 浏览器下载安装解压 解压后控制台输入控制命令cmd 将解压后的jmter bin文件夹下的jmter bat拖入控制台 打开jmter 使用Jmter 在jmter中可以添加各种测试 这是一个抗压测试 各种功能测试可以百度
  • SIP协议-02 原理讲解

    文章目录 1 SIP实现机制 2 SIP网络元素 2 1 用户代理 2 2 代理服务器 2 3 重定向服务器 2 4 位置服务器 2 5 注册服务器 3 SIP中的几个重要概念 3 1 Messages 消息 3 2 Dialog 对话 3
  • PLSQL Developer安装配置教程(超详细)

    前言 首先要有oracle数据库或者有oracle服务器 才可以实现使用PLSQL Developer 工具连接到oracle数据库进行开发 1 下载 PLSQL Developer 链接 https pan baidu com s 1zV
  • 是科研人就要快!加速你的算法!

    在科研中 大多数论文其实还是看精度和效果的 对于速度其实没有那么高的追求 很多人用速度评价自己算法的复杂度很低 但实际上这是不准确的 当然在精度占优的情况下 能够提高速度 给自己的实验结果增彩 关于算法程序的加速 在动手前先要按照如下流程进
  • Linux下的iptables防火墙管理方法

    Linux下的iptables防火墙管理方法 文章目录 Linux下的iptables防火墙管理方法 1 什么是iptables 2 iptables命令参数 3 iptables策略 4 iptables地址转发 5 iptables端口
  • VUE中使用RSA加密

    一 安装 npm install jsencrypt save 二 在main js中引用依赖 导入RSA加密 import JSEncrypt from jsencrypt Vue prototype getRsaCode functio
  • 6种延时队列的实现方案

    延时队列的应用 什么是延时队列 顾名思义 首先它要具有队列的特性 再给它附加一个延迟消费队列消息的功能 也就是说可以指定队列中的消息在哪个时间点被消费 延时队列在项目中的应用还是比较多的 尤其像电商类平台 订单成功后 在30分钟内没有支付
  • 一级二级菜单slideToggle

  • 最短路径之迪克斯特拉(Dijkstra)算法

    何谓最短路径 顾名思义就是在一个图中 一个顶点到另外一个顶点的最短距离拉 那么这里有一点要注意 就是在网图中 边的权值各不相同 最短路径指的是俩点之间的连线权值最小 在非网图 边的权值都默认为1 中最短路径指的是边数最少的 从一个顶点到其余
  • 3D Vision--生成空间任意圆柱及任意直线

    contents 写在前面 几何原理 圆柱的方程 用于拟合已有圆柱 圆柱空间参数方程 用于生成圆柱 python代码 生成结果 完 写在前面 1 内容 如何生成空间任意圆柱体点云及其轴线 任意直线的生成也就是本文轴线的生成方式 2 环境 o
  • shell 命令 grep -v

    grep v shell命令中 grep命令 是对文本行的搜索命令 grep v就是反向文本行搜索 当控制台输出很多时 有很多是我们不想看到的 就可以用到grep v命令 举个栗子 ls l 结果如下 我们不想看到包含repair的行 执行
  • opencv轻松入门面向python下载_《OpenCV轻松入门:面向Python(博文视点出品)》(李立宗)【摘要 书评 试读】- 京东图书...

    本书采用Python语言 以案例的形式介绍了OpenCV中的常用算法及其使用方法 Python是一种高效的开发语言 使用Python调用OpenCV中的算法 可以快速地实现计算机视觉应用 于仕琪 OpenCV开源库在国内的早期推广者 Ope
  • oracle中 case when,Oracle CASE WHEN的用法

    CASE WHEN的两种表达形式 方式一 CASE WHEN D10 成功签收 THEN 1 WHEN D11 成功签收 THEN 1 ELSE NULL END WHEN 中间是用判断表达式 方式二 CASE D10 WHEN 成功签收
  • OSError: No such file or directory: 'C:\\Users\\2019\\AppData\\Roaming\\nltk_data\\corpora\\stopword

    nltk download
  • 在VS2017中使用Qt的ui界面添加控件后在cpp源文件中无法调用解决方法

    右键项目属性 找到 Qt Project Settings 将Show in Build Log 属性设置为否 点击确定回到cpp就可以使用ui调用部件了
  • python怎么测试uwsgi并发量_uWSGI使用介绍及性能测试结果

    uwsgi介绍 uWSGI是一个Web服务器 它实现了WSGI协议 uwsgi http等协议 Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换 要注意 WSGI uwsgi uWSGI 这三个概念的区分 1 W
  • ES集群性能优化及维护

    ES集群性能优化及维护 注 集群 elasticsearch 版本为 v7 2 1 1 ES索引刷新间隔设置 index refresh interval 刷新时间 默认1 PUT index all settings preserve e
  • 基于C++的栈的两种实现(数组和链表)

    栈 概述 基本操作 用数组实现栈 用链表实现栈 测试 概述 栈是一种只能在表的顶端进行插入和删除运算的线性表 其主要特点是后进先出 LIFO 或先进后出 FILO 该数据结构的示意图如下 基本操作 函数名 用途 bool empty 判断栈