数据结构 - C/C++ - 栈

news2024/11/15 12:45:45

目录

结构特性

结构实现

结构容器

结构设计

顺序栈

链式栈


结构特性

  • 栈(stack)是线性表的一种形式,限定仅在表的一端进行插入或者删除的操作。

  • 栈顶 - 表中允许插入、删除的一端称为栈顶(top),栈顶位置是可以发生变化的。

    • 插入 - 进栈、入栈、压栈。

    • 删除 - 出栈。

  • 栈底 - 表中不允许插入、删除的一端称为栈底(bottom),栈底位置通常是固定不变的。

  • 空栈 - 表中不存在任何元素。

  • LIFO - last in first out - 先进后出、后进先出。

结构实现

  • 顺序栈
int Arr[5] = {0};

[栈顶] - Arr[4]
[元素] - Arr[x]
[元素] - Arr[x]
[元素] - Arr[x]
[栈底] - Arr[0] 
  • 顺序栈使用连续的内存空间来存储元素,通常使用数组来实现。

  • 栈底指向数组起始地址(下标为0的元素)。

  • 栈顶指向当前栈中最后一个压入的元素位置。

  • 链式栈

[栈顶元素 | 指针] -> [下一个元素 | 指针] -> ... -> [栈底元素 | 空指针]

结构容器

#include <iostream>
#include <stack>

int main()
{
    std::stack<int> myStack;

    std::cout << myStack.size() << std::endl;
    std::cout << myStack.empty() << std::endl;

    //入栈
    myStack.push(1);
    myStack.push(2);
    myStack.push(3);

    std::cout << myStack.size() << std::endl;
    std::cout << myStack.empty() << std::endl;

    //获取栈顶元素
    std::cout << myStack.top() << std::endl;

    //出栈
    myStack.pop();
    std::cout << myStack.top() << std::endl;

    return 0;
}

结构设计

顺序栈

#include <iostream>

class Stack
{
public:
    int*    data;                   //栈的数组
    int     topIndex;               //栈顶索引
    int     capacity;               //栈的容量

public:
    Stack();                        //默认构造函数
    Stack(int Size);                //有参构造函数
    Stack(const Stack& other);      //拷贝构造函数
    ~Stack();                       //默认析构函数

public:
    void Push(int value);           //入栈函数
    void Pop();                     //出栈函数
    int Top();                      //栈顶元素

public:
    bool IsEmpty();                 //是否为空
    int Size();                     //元素个数

};

Stack::Stack() : data(nullptr), topIndex(-1), capacity(0)
{

}

Stack::Stack(int Size) : topIndex(-1), capacity(Size)
{
    this->data = new int[capacity] {};
}

Stack::Stack(const Stack& other) : data(new int[other.capacity]), topIndex(other.topIndex), capacity(other.capacity)
{
    for (size_t i = 0; i < capacity; i++)
    {
        this->data[i] = other.data[i];
    }
}

Stack::~Stack()
{
    if (data != NULL)
    {
        delete[] data;
        data = nullptr;
    }
}

void Stack::Push(int value)
{
    if (Size() == capacity)
    {
        //默认容量
        int size = capacity;

        //动态扩容
        capacity = (capacity == 0) ? 5 : capacity * 2;

        //申请内存
        int* newData = new int[capacity] {};

        //数据拷贝
        memcpy(newData, this->data, size * sizeof(int));

        //释放数据
        if (this->data != NULL)
        {
            delete[] this->data;
        }

        //修正指向
        this->data = newData;

    }

    data[++topIndex] = value;
}

void Stack::Pop()
{
    if (IsEmpty())
    {
        return;
    }
    --topIndex;
}

int Stack::Top()
{
    return this->data[topIndex];
}

bool Stack::IsEmpty()
{
    return this->topIndex == -1 ? true : false;
}

int Stack::Size()
{
    return topIndex + 1;
}

链式栈

class Node
{
public:
    int value;
    Node* Next;
    Node(int Num) : value(Num), Next(nullptr) {}
};

class Stack
{
public:
    Node* Head;

public:
    Stack() : Head(nullptr) 
    {

    }

    Stack(const Stack& other)
    {
        if (other.Head == nullptr)
        {
            Head = nullptr;
        }
        else
        {           
            Head = new Node(other.Head->value);
            Node* head = Head;
            Node* node = other.Head->Next;
            while (node != nullptr)
            {
                head->Next = new Node(node->value);
                head = head->Next;
                node = node->Next;
            }
        }
    }

    ~Stack()
    {
        Clear();
    }

public:

    void Push(int value)
    {
        Node* node = new Node(value);

        node->Next = Head;

        Head = node;
    }

    void Pop()
    {
        if (!IsEmpty())
        {
            Node* temp = Head;
            Head = Head->Next;
            delete temp;
        }
    }

    int Top()
    {
        if (!IsEmpty())
        {
            return Head->value;
        }
    }

public:

    bool IsEmpty()
    {
        return Head == nullptr;
    }

    void Clear()
    {
        while (!IsEmpty())
        {
            Pop();
        }
    }

};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1883649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10月开始,所有新来日本的外国人都必须加入公共年金体系!

为了吸引更多外国人来日本工作并为他们提供更好的养老保障&#xff0c;日本厚生劳动省最近宣布了一项新政策。 从今年10月开始&#xff0c;所有新来日本的外国人都必须加入公共年金体系。 虽然之前已经有这个要求&#xff0c;但还是有不少人没加入。 因此&#xff0c;日本年金机…

每日Attention学习7——Frequency-Perception Module

模块出处 [link] [code] [ACM MM 23] Frequency Perception Network for Camouflaged Object Detection 模块名称 Frequency-Perception Module (FPM) 模块作用 获取频域信息&#xff0c;更好识别伪装对象 模块结构 模块代码 import torch import torch.nn as nn import to…

Win11找不到组策略编辑器(gpedit.msc)解决

由于需要同时连接有线网络和无线网络&#xff0c;且重启后双网络都自动连接&#xff0c;因此需要配置组策略。 但是win11找不到组策略编辑器。 灵感来源&#xff1a;Win11找不到组策略编辑器&#xff08;gpedit.msc&#xff09;解决教程 - 知乎 (zhihu.com) 在Win11中&#…

基于隐马尔可夫模型的股票预测【HMM】

基于机器学习方法的股票预测系列文章目录 一、基于强化学习DQN的股票预测【股票交易】 二、基于CNN的股票预测方法【卷积神经网络】 三、基于隐马尔可夫模型的股票预测【HMM】 文章目录 基于机器学习方法的股票预测系列文章目录一、HMM模型简介&#xff08;1&#xff09;前向后…

Eclipse 2024最新版本分享

一、软件介绍 Eclipse是一个开源的、基于Java的可扩展开发平台&#xff0c;最初由IBM公司开发&#xff0c;后于2001年贡献给开源社区&#xff0c;并由Eclipse基金会负责管理和开发。 如果在官网上下载比较慢&#xff0c;可以试试从云盘中下载&#xff0c;解压即可使用。 二、下…

Flutter循序渐进==>数据结构(列表、映射和集合)和错误处理

导言 填鸭似的教育确实不行&#xff0c;我高中时学过集合&#xff0c;不知道有什么用&#xff0c;毫无兴趣&#xff0c;等到我学了一门编程语言后&#xff0c;才发现集合真的很有用&#xff1b;可以去重&#xff0c;可以看你有我没有的&#xff0c;可以看我有你没有的&#xf…

获取onnx模型输入输出结构信息的3种方式:ONNX、onnxruntime、netron

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

机器人控制系列教程之任务空间运动控制器搭建(2)

Simulink中的实例 推文《机器人控制系列教程之任务空间运动控制器搭建(1)》中&#xff0c;我们详细的讲解了Simulink中的taskSpaceMotionModel模块&#xff0c;实现的方式可以按照如下的步骤。 可以控制器模型替换为taskSpaceMotionModel模块后&#xff0c;该模块的输入分别为…

昇思MindSpore学习总结七——模型训练

1、模型训练 模型训练一般分为四个步骤&#xff1a; 构建数据集。定义神经网络模型。定义超参、损失函数及优化器。输入数据集进行训练与评估。 现在我们有了数据集和模型后&#xff0c;可以进行模型的训练与评估。 2、构建数据集 首先从数据集 Dataset加载代码&#xff0…

SSM泰华超市商品管理系统-计算机毕业设计源码11946

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据新增流程 3.2.2 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 系统总体设…

PV操作经典例题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文☀️☀️☀️三、总结&#x1f353;&#x1f353;&#x1f353; 一、前言&#x1f680;&#x1f680;&am…

C#/WPF 自制截图工具

在日常使用电脑办公时&#xff0c;我们经常遇到需要截图然后保存图片&#xff0c;我们往往需要借助安装截图工具才能实现&#xff0c;现在我们通过C#自制截图工具&#xff0c;也能够轻松进行截图。 我们可以通过C#调用WindousAPI来实现截图&#xff0c;实例代码如下&#xff1a…

WIN11,如何同时连接有线网络与WLAN无线网络

之前写了两篇文章&#xff0c;一篇是双网卡多网卡时win11如何设置网卡优先级_多网卡设置网卡优先级-CSDN博客 另一篇是win11 以太网和WLAN冲突 连接网线时导致WiFi掉线 解决_win11 以太网和wifi不能同时生效-CSDN博客 这篇是对上面两篇的补充&#xff1a;主要解决电脑重启后&…

Web2Code :网页理解和代码生成能力的评估框架

多模态大型语言模型&#xff08;MLLMs&#xff09;在过去几年中取得了爆炸性的增长。利用大型语言模型&#xff08;LLMs&#xff09;中丰富的常识知识&#xff0c;MLLMs在处理和推理各种模态&#xff08;如图像、视频和音频&#xff09;方面表现出色&#xff0c;涵盖了识别、推…

Jetbrains AI Assistant用了好几个月了,果然是好用的

ai assistant激活成功后&#xff0c;如图 ai assistant渠道&#xff1a;https://web.52shizhan.cn/activity/ai-assistant 在去年五月份的 Google I/O 2023 上&#xff0c;Google 为 Android Studio 推出了 Studio Bot 功能&#xff0c;使用了谷歌编码基础模型 Codey,Codey 是…

小阿轩yx-案例:MySQL主从复制与读写分离

小阿轩yx-案例&#xff1a;MySQL主从复制与读写分离 案例分析 概述 实际生产环境中 如果对数据库读和写都在同一个数据库服务器中操作&#xff0c;无论在安全性、高可用性还是高并发等各个方面都完全不能满足实际需求一般都是通过主从复制&#xff08;Master-Slave&#xf…

【源码+文档+调试讲解】基于vue的线上点餐系统

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了线上点餐系统的开发全过程。通过分析线上点餐系统管理的不足&#xff0c;创建了一个计算机管理线上点餐系统的方案。文章介绍了线上点餐系统的系统分析部分&…

【PYTORCH,TENSORFLOW环境配置,安装,自用代码】

conda -V&#xff08;查看版本&#xff0c;这步不要也罢&#xff09; conda create -n test python3.7&#xff08;创建环境&#xff09; conda activate test&#xff08;激活&#xff09; conda env list&#xff08;查看自己的环境&#xff09; nvidia-smi&#xff08;查…

Ubuntu DNS服务配置 深度解析

测试方法 resolvectl status dig alidns.com 修改实践 直接用接口配置&#xff0c;没用 /etc/resolv.conf&#xff0c;有效 /etc/netplan/01-network-manager-all.yaml,无效 /etc/systemd/resolved.conf&#xff0c;见link&#xff0c;为全局配置 [Resolve] DNS1.1.1.1 Fa…

二维数组-----螺旋性矩阵输出

题目有点难&#xff0c;ok其实是很难。。。 观察样例输出&#xff0c;不难发现&#xff0c;螺旋数组中元素的递增轨迹为&#xff1a;右右右、下下下、左左左、上上上 简明为&#xff1a;右、下、左、上。可以设开始递增的元素1的位置为&#xff08;x&#xff0c;y)&#xff0c…