C/C++数据结构之堆栈(Stack):理解、实现与运用

当我们讨论堆栈时,我们首先需要了解它的概念和基本原理。堆栈是一种后进先出(Last In, First Out,LIFO)的数据结构,它的操作主要包括压栈(Push)和弹栈(Pop),以及查看栈顶元素(Top)。这种数据结构常用于解决与函数调用、表达式求值和回溯算法相关的问题。

堆栈是计算机科学中一种重要的数据结构,它遵循“后进先出”(Last In, First Out,LIFO)的原则,就像我们堆放书籍一样,最后放入的书籍最先取出。在本文中,我们将深入讨论堆栈的概念、抽象堆栈、顺序栈、链栈以及堆栈在数制转换中的应用,并通过详细的代码例子进行解释。

1. 堆栈的概念

堆栈是一种线性数据结构,具有两个基本操作:压栈(Push)和弹栈(Pop)。压栈表示将元素放入堆栈顶部,而弹栈表示从堆栈顶部取出元素。堆栈的典型应用包括函数调用、表达式求值和回溯算法等。

2. 抽象堆栈

在讨论具体实现之前,让我们先来看看抽象堆栈的接口:

template <typename T>
class AbstractStack {
public:
    virtual void push(const T& value) = 0;
    virtual void pop() = 0;
    virtual T top() const = 0;
    virtual bool isEmpty() const = 0;
    virtual size_t size() const = 0;
};

这个抽象类定义了堆栈的基本操作,我们将通过不同的实现来具体化这些操作。

3. 顺序栈及其典型成员函数

顺序栈是使用数组实现的堆栈,下面是顺序栈的实现:

template <typename T>
class ArrayStack : public AbstractStack<T> {
private:
    static const size_t MAX_SIZE = 100;
    T data[MAX_SIZE];
    size_t topIndex;

public:
    ArrayStack() : topIndex(0) {}

    void push(const T& value) override {
        if (topIndex < MAX_SIZE) {
            data[topIndex++] = value;
        } else {
            // 栈满,抛出异常或进行扩容等处理
        }
    }

    void pop() override {
        if (!isEmpty()) {
            --topIndex;
        } else {
            // 栈空,抛出异常或进行其他处理
        }
    }

    T top() const override {
        if (!isEmpty()) {
            return data[topIndex - 1];
        } else {
            // 栈空,抛出异常或进行其他处理
            return T();
        }
    }

    bool isEmpty() const override {
        return topIndex == 0;
    }

    size_t size() const override {
        return topIndex;
    }
};

4. 链栈及其典型成员函数

链栈是使用链表实现的堆栈,下面是链栈的实现:

template <typename T>
struct Node {
    T data;
    Node* next;
    Node(const T& value) : data(value), next(nullptr) {}
};

template <typename T>
class LinkedStack : public AbstractStack<T> {
private:
    Node<T>* topNode;

public:
    LinkedStack() : topNode(nullptr) {}

    void push(const T& value) override {
        Node<T>* newNode = new Node<T>(value);
        newNode->next = topNode;
        topNode = newNode;
    }

    void pop() override {
        if (!isEmpty()) {
            Node<T>* temp = topNode;
            topNode = topNode->next;
            delete temp;
        } else {
            // 栈空,抛出异常或进行其他处理
        }
    }

    T top() const override {
        if (!isEmpty()) {
            return topNode->data;
        } else {
            // 栈空,抛出异常或进行其他处理
            return T();
        }
    }

    bool isEmpty() const override {
        return topNode == nullptr;
    }

    size_t size() const override {
        size_t count = 0;
        Node<T>* current = topNode;
        while (current != nullptr) {
            ++count;
            current = current->next;
        }
        return count;
    }
};

5. 堆栈数制转换问题

堆栈在数制转换中有着广泛的应用,我们以十进制到二进制的转换为例来演示:

std::string decimalToBinary(int decimal) {
    LinkedStack<int> stack;
    while (decimal > 0) {
        stack.push(decimal % 2);
        decimal /= 2;
    }

    std::string binary;
    while (!stack.isEmpty()) {
        binary += std::to_string(stack.top());
        stack.pop();
    }

    return binary.empty() ? "0" : binary;
}

通过堆栈的压栈和弹栈操作,我们可以轻松实现十进制到二进制的转换。

这是一篇关于C/C++数据结构之堆栈(Stack)的详细文章,覆盖了堆栈的概念、抽象堆栈、顺序栈、链栈以及堆栈在数制转换中的应用。如果你想进一步了解堆栈相关的资源和知识点,以下是一些可能有帮助的链接:

  1. 堆栈的概念和基本原理:

    • 堆栈 - 维基百科
  2. C++ 模板类及虚函数的使用:

    • C++ Templates
  3. 顺序栈的实现:

    • C++ 标准模板库(STL)
  4. 链栈的实现:

    • C++ 链表详解
  5. 堆栈在数制转换中的应用:

    • 进制转换算法
  6. 其他相关资源:

    • 《数据结构与算法分析》 - Mark Allen Weiss(书籍)

请注意,链接的内容可能会有更新,建议查看最新的文档和教程。希望这些资源对你深入理解堆栈及其在C/C++中的应用有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SEnet注意力机制(逐行代码注释讲解)

目录 ⒈结构图 ⒉机制流程讲解 ⒊源码&#xff08;pytorch框架实现&#xff09;及逐行解释 ⒋测试结果 ⒈结构图 左边是我自绘的&#xff0c;右下角是官方论文的。 ⒉机制流程讲解 通道注意力机制的思想是&#xff0c;对于输入进来的特征层&#xff0c;我们在每一个通道学…

基于STM32的多组外部中断(EXTI)的优化策略与应用

在某些嵌入式应用中&#xff0c;可能需要同时处理多个外部中断事件。STM32系列微控制器提供了多组外部中断线&#xff08;EXTI Line&#xff09;&#xff0c;可以同时配置和使用多个GPIO引脚作为外部中断触发器。为了有效管理和处理多组外部中断&#xff0c;我们可以采取一些优…

Linux非阻塞等待示例

Linux非阻塞等待实例 非阻塞等待的意义&#xff1a;简单的多进程编程示例代码解释 非阻塞等待的意义&#xff1a; 非阻塞等待在多进程编程中的意义主要体现在提高系统的响应性、实现异步任务执行、动态任务管理和多任务协同工作等方面。它允许父进程在等待子进程退出的同时&…

优化|优化求解器自动调参

原文信息&#xff1a;MindOpt Tuner: Boost the Performance of Numerical Software by Automatic Parameter Tuning 作者&#xff1a;王孟昌 &#xff08;达摩院决策智能实验室MindOpt团队成员&#xff09; 一个算法开发者&#xff0c;可能会幻想进入这样的境界&#xff1a;算…

C++题目练习第二十天__有效的完全平方数

题目链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目&#xff1a; 给你一个正整数 num 。如果 num 是一个完全平方数&#xff0c;则返回 true &#xff0c;否则返回 false 。 完全平方数 是一个可以写成某个整数的平方的整数。…

Android 弹出自定义对话框

Android在任意Activity界面弹出一个自定义的对话框&#xff0c;效果如下图所示: 准备一张小图片&#xff0c;右上角的小X图标64*64&#xff0c;close_icon.png&#xff0c;随便找个小图片代替&#xff1b; 第一步&#xff1a;样式添加&#xff0c;注意&#xff1a;默认在value…

2023年中职“网络安全“—Web 渗透测试②

2023年中职“网络安全“—Web 渗透测试② Web 渗透测试任务环境说明&#xff1a;1.访问http://靶机IP/web1/,获取flag值&#xff0c;Flag格式为flag{xxx}&#xff1b;2.访问http://靶机IP/web2/,获取flag值&#xff0c;Flag格式为flag{xxx}&#xff1b;3.访问http://靶机IP/web…

git拉取普通idea Java项目module没有build的问题

在不断完成一个项目的时候&#xff0c;会有不断新加的module&#xff0c;我们用git拉取时会发生没有识别新module的情况。 解决方法是右键项目名称&#xff0c;然后点击Open Module Settings 接下来&#xff0c;点击Module&#xff0c;加号&#xff0c;新建Module的名字就是在g…

深度学习乳腺癌分类 计算机竞赛

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

sqli-labs关卡18(基于http头部报错盲注)通关思路

文章目录 前言一、靶场通关需要了解的知识点1、什么是http请求头2、为什么http头部可以进行注入 二、靶场第十八关通关思路1、判断注入点2、爆数据库名3、爆数据库表4、爆数据库列5、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做…

若依框架数据源切换为pg库

一 切换数据源 在ruoyi-admin项目里引入pg数据库驱动 <dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.2.18</version> </dependency>修改配置文件里的数据源为pg spring:d…

测不准原理

测不准原理 算符的对易关系 commutation relation 测不准原理的矢量推导 Schwarz inequality: 设对易关系&#xff1a; 设一个新态&#xff1a; 投影&#xff1a; 那么有&#xff1a; 代回Schwarz inequality 即可证明&#xff1a;

2023OceanBase年度发布会后,有感

很荣幸收到了OceanBase邀请&#xff0c;于本周四&#xff08;11月16日&#xff09;参加了OceanBase年度发布会并参加了DBA老友会&#xff0c;按照理论应该我昨天&#xff08;星期五&#xff09;就回到成都了&#xff0c;最迟今天白天就该把文章写出来了&#xff0c;奈何媳妇儿买…

zsh和ohmyzsh安装指南+插件推荐

文章目录 1. 安装指南2. 插件配置指南3. 参考信息 1. 安装指南 1. 安装 zsh sudo apt install zsh2. 安装 Oh My Zsh 国内访问GitHub sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"这将安装 Oh My Zsh 和所…

75基于matlab的模拟退火算法优化TSP(SA-TSP),最优路径动态寻优,输出最优路径值、路径曲线、迭代曲线。

基于matlab的模拟退火算法优化TSP(SA-TSP)&#xff0c;最优路径动态寻优&#xff0c;输出最优路径值、路径曲线、迭代曲线。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 75matlab模拟退火算法TSP问题 (xiaohongshu.com)

联想系列台式机Win11系统改Win7系统BIOS设置步骤

联想最新一代的台式机默认操作系统Win11&#xff0c;采用UEFIGPT启动模式&#xff0c;并且开启了安全启动功能&#xff0c;一般用户不能直接将Win11改成Win7&#xff0c;如果需要更改操作系统&#xff0c;是需要再BIOS菜单中关闭安全启动功能的&#xff0c;并且把启动模式设置成…

Linux CentOS7 添加网卡

一台主机中安装多块网卡&#xff0c;有许多优势。可以实现多项功能。 为了学习网卡参数的设置&#xff0c;可以为主机添加多块网卡。与添加磁盘一样&#xff0c;要在VMware中设置。利用图形化方式或命令行查看或设置网卡。本文仅作一初步讨论。有关网络参数的设置不在讨论之列…

【Web】Ctfshow SSRF刷题记录1

核心代码解读 <?php $url$_POST[url]; $chcurl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $resultcurl_exec($ch); curl_close($ch); ?> curl_init()&#xff1a;初始curl会话 curl_setopt()&#xff1a;会…

C语言进阶第十课 --------文件的操作

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

HarmonyOS开发Java与ArkTS如何抉择

在“鸿蒙系统实战短视频App 从0到1掌握HarmonyOS”视频课程中&#xff0c;很多学员来问我&#xff0c;在HarmonyOS开发过程中&#xff0c;面对Java与ArkTS&#xff0c;应该选哪样&#xff1f; 本文详细分析Java与ArkTS在HarmonyOS开发过程的区别&#xff0c;力求解答学员的一些…