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

news2024/11/20 23:33:26

当我们讨论堆栈时,我们首先需要了解它的概念和基本原理。堆栈是一种后进先出(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++中的应用有所帮助。

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

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

相关文章

学习css过渡动画-transition

文章目录 前言transition属性语法宽度改变效果透明度改变效果位置改变效果如有启发&#xff0c;可点赞收藏哟~ 前言 通常&#xff0c;当一个元素的样式属性值发生变化时&#xff0c;会立即看到页面发生变化。 css属性transition能让页面元素不是立即的、而是慢慢的从一种状态变…

java 访问sqlserver 和 此驱动程序不支持jre1.8错误

sqlserver数据如下&#xff1b; TestSQL.java&#xff1b; import java.sql.*;public class TestSQL {public static void main(String[] args) throws ClassNotFoundException, SQLException {String driverName "com.microsoft.sqlserver.jdbc.SQLServerDriver";…

工程化实战 - 前端AST(进阶)

###脚手架 *快速自动化搭建启动工具 目标: ####第一步:处理依赖 npm i path npm i chalk4.1.0 npm i fs-extra npm i inquirer8.2.2 npm i commander npm i axios npm i download-git-repo //ora easy-table figlet ####第二步:处理工程入口 ####3.加入命令交互 交互好帮手…

LeetCo

题目描述如下&#xff1a; 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M …

开源WIFI继电器之方案介绍

一、实物 1、外观 2、电路板 二、功能说明 输出一路继电器常开信号&#xff0c;最大负载电流10A输入一路开关量检测联网方式2.4G Wi-Fi通信协议MQTT配网方式AIrkiss&#xff0c;SmartConfig设备管理本地Web后台管理&#xff0c;可配置MQTT参数供电AC220V其它一个功能按键&…

08-黑马点评项目发布笔记和查看笔记功能的实现

发布笔记 数据模型 tb_blog探店笔记表,包含笔记的标题、文字、图片等 tb_blog探店笔记表对应的实体类 增加用户图标和和用户姓名以及是否被点赞过了的字段,这些字段不属于Blog表只是为了实现在展示笔记的时候同时展示用户的信息 Data EqualsAndHashCode(callSuper false) …

<MySQL> 什么是JDBC?如何使用JDBC进行编程?

目录 一、JDBC是什么&#xff1f; 二、JDBC常用接口和类 2.1 DataSource 2.2 Connection 2.3 Statement 2.4 ResultSet 三、JDBC的使用 3.1 获得数据库驱动包 3.2 添加到项目依赖 3.3 描述数据库服务器 3.4 建立数据库连接 3.6 执行SQL语句和接收返回数据 3.7 释放…

利用 Pandoc + ChatGPT 优雅地润色论文,并保持 Word 公式格式:Pandoc将Word和LaTeX文件互相转化

论文润色完美解决方案&#xff1a;Pandoc 与 ChatGPT 的强强联合 写在最前面其他说明 一、通过 Pandoc 将 Word 转换为 LaTeX 的完整指南步骤 1: 安装 PandocWindows:macOS:Linux: 步骤 2: 准备 Word 文档步骤 3: 转换文档步骤 4: 检查并调整输出步骤 5: 编译 LaTeX 文档总结 二…

企业制作产品操作手册,真的很有必要吗?

企业制作产品操作手册通常是必不可少的。一份详细的指南可以使得用户或操作员能够了解如何正确地使用产品。然而&#xff0c;有些企业可能会怀疑这一做法的必要性&#xff0c;认为这只是一项额外的成本和劳动力投入。但是&#xff0c;企业产品操作手册是提高产品使用效率和用户…

【c++】——类和对象(中)——实现完整的日期类(优化)万字详细解疑答惑

作者:chlorine 专栏:c专栏 赋值运算符重载()()():实现完整的日期类(上) 我走的很慢&#xff0c;但我从不后退。 【学习目标】 日期(- - --)天数重载运算符 日期-日期 返回天数 对日期类函数进行优化(不符合常理的日期&#xff0c;负数&#xff0c;const成员)c中重载输入cin和输…

基于STM32的外部中断(EXTI)在嵌入式系统中的应用

外部中断&#xff08;External Interrupt&#xff0c;EXTI&#xff09;是STM32嵌入式系统中常见且重要的功能之一。它允许外部事件&#xff08;例如按键按下、传感器触发等&#xff09;通过适当的引脚触发中断&#xff0c;从而应用于各种嵌入式系统中。在STM32微控制器中&#…

Spring Boot - filter 的顺序

定义过滤器的执行顺序 1、第一个过滤器 import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; impor…

二维码智慧门牌管理系统升级解决方案:高效运营,信息尽在掌握

文章目录 前言一、升级要点二、方案优势三、应用场景四、客户案例 前言 在这个日新月异的时代&#xff0c;二维码智慧门牌管理系统已经成为了各行各业的标配。为了更好地满足用户需求&#xff0c;提升运营效率&#xff0c;我们推出了全新的升级解决方案。这个方案将让你轻松掌…

<C++>类和对象下|初始化列表|explicit static|友元|内部类|匿名对象|构造函数的优化

文章目录 1. 初始化列表2. explicit关键字3. 友元3.1 友元函数3.2 友元类 4. static关键字4.1 概念4.2 特性 5.内部类5.1 概念5.2 特性 6. 匿名对象7. 拷贝构造时的优化 1. 初始化列表 在类的构造函数体中&#xff0c;对成员属性写的操作叫做赋值&#xff0c;那么成员的初始化…

springBoot中starter

springBoot项目中引入starter 项目引入xxljob&#xff0c;仅需要导入对应的starter包&#xff0c;即可进行快速开发 <dependency><groupId>com.ydl</groupId><artifactId>xxl-job-spring-boot-starter</artifactId><version>0.0.1-SNAPS…

Ubuntu20.04 安装微信 【优麒麟的镜像源方式安装】

缺点&#xff1a;是网页版本的嵌入&#xff0c;功能少。 推荐wine方式安装&#xff1a;Ubuntu20.04 安装微信 【wine方式安装】推荐 从优麒麟的镜像源安装原生微信 应用下载-优麒麟&#xff5c;Linux 开源操作系统 新建文件software.list sudo vi /etc/apt/sources.list.d/…

WordPress主题WoodMart v7.3.2 WooCommerce主题和谐汉化版下载

WordPress主题WoodMart v7.3.2 WooCommerce主题和谐汉化版下载 WoodMart是一款出色的WooCommerce商店主题&#xff0c;它不仅提供强大的电子商务功能&#xff0c;还与流行的Elementor页面编辑器插件完美兼容。 主题文件在WoodMart Theme/woodmart.7.3.2.zip&#xff0c;核心在P…

Golang起步篇(Windows、Linux、mac三种系统安装配置go环境以及IDE推荐以及入门语法详细释义)

Golang起步篇 Golang起步篇一. 安装Go语言开发环境1. Wondows下搭建Go开发环境(1). 下载SDK工具包(2). 解压下载的压缩包&#xff0c;放到特定的目录下&#xff0c;我一般放在d:/programs下(路径不能有中文或者特殊符号如空格等)(3). 配置环境变量步骤1&#xff1a;先打开环境变…

python自动化标注工具+自定义目标P图替换+深度学习大模型(代码+教程+告别手动标注)

省流建议 本文针对以下需求&#xff1a; 想自动化标注一些目标不再想使用yolo想在目标检测/语意分割有所建树计算机视觉项目想玩一玩大模型了解自动化工具了解最前沿模型自定义目标P图替换… 确定好需求&#xff0c;那么我们发车&#xff01; 实现功能与结果 该模型将首先…

【SQL server】数据库、数据表的创建

创建数据库 --如果存在就删除 --所有的数据库都存在sys.databases当中 if exists(select * from sys.databases where name DBTEST)drop database DBTEST--创建数据库 else create database DBTEST on --数据文件 (nameDBTEST,--逻辑名称 字符串用单引号filenameD:\DATA\DBT…