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++中的应用有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webpack 中,filename 和 chunkFilename 的区别

filename filename 是一个很常见的配置&#xff0c;就是对应于 entry 里面的输入文件&#xff0c;经过webpack打包后输出文件的文件名。比如说经过下面的配置&#xff0c;生成出来的文件名为 index.min.js。 chunkFilename chunkFilename 指未被列在 entry 中&#xff0c;却…

Java 教育局民办教育信息服务与监管平台

1) 项目背景 按照《中华人民共和国民办教育促进法》和《中华人民共和国政府信息公开条例》的相关规定&#xff0c;为满足学生和家长、社会各界获取权威信息的需求&#xff0c;着力解决服务老百姓最后一公里问题&#xff0c;达到宣传民办教育和引导家长择校的效果&#xff0…

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 …

leetcoe刷题日志-6N字形变换

将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时&#xff0c;排列如下&#xff1a; 之后&#xff0c;你的输出需要从左往右逐行读取&#xff0c;产生出一个新的字符串&#…

世微 降压恒流驱动IC 景观亮化洗墙灯舞台灯汽车灯LED照明 AP5199S

1. 特性 支持高辉调光&#xff0c;调光比 平均电流工作模式 高效率&#xff1a;最高可达 95% 输出电流可调范围 60mA~12A 最大工作频率 1MHz 恒流精度≤3% 支持 PWM 封装&#xff1a;SOP8 2. 应用领域 景观亮化洗墙灯 舞台调光效果灯 汽车照明 3. 说明 AP5199S…

读像火箭科学家一样思考笔记02_与不确定性共舞(下)

1. 万有理论 1.1. 相对论 1.1.1. 适用于体积非常大的物体 1.2. 量子力学 1.2.1. 适用于非常小的物体 1.2.2. 在量子力学诞生之前&#xff0c;物理学一直强调的是因果关系&#xff0c;即做这件事&#xff0c;就会得到那个结果 1.2.3. 量子力学讲的似乎是&#xff1a;当我们…

RobotFramework之如何使用数据驱动(十二)

学习目录 引言 数据驱动是什么&#xff1f; 非驱动方式测试案例 通过添加Template模板的方式&#xff0c;实现数据驱动 将参数放在变量文件中&#xff0c;实现数据驱动 引言 大家平时在写接口或者UI自动化用例的时候&#xff0c;是否遇到这种情况&#xff1a; 写了很多条…

关于Android音效播放,【备忘】

主要还是希望开箱即用。所以才有了这篇&#xff0c;也是备忘。 以下代码适合Android5.0版本以后 private SoundPool soundPool;//特效播放private Map<String,Integer> soundPoolMap;// Builder buildernew SoundPool.Builder();builder.setMaxStreams(4);///最大…

(Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分程序&#xff1a; 四、完整程序数据说明文档下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matalb平…

TURN 协议

TURN 地址分配 抓包过程 TURN 连接建立 这里指的是 Client 收到对端从 TURN 分配的 IP 和 端口 &#xff0c;和对端的 TURN 和 IP 绑定的过程 CreatePermission Request 等消息&#xff0c;都会携带有对端的 TURN 和 IP 抓包过程

【数据结构】图的存储结构(邻接矩阵)

一.邻接矩阵 1.图的特点 任何两个顶点之间都可能存在边&#xff0c;无法通过存储位置表示这种任意的逻辑关系。 图无法采用顺序存储结构。 2.如何存储图&#xff1f; 将顶点与边分开存储。 3.邻接矩阵&#xff08;数组表示法&#xff09; 基本思想&#xff1a; 用一个一维数…

C++二分查找算法:查找和最小的 K 对数字

相关专题 二分查找相关题目 题目 给定两个以 非递减顺序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。 定义一对值 (u,v)&#xff0c;其中第一个元素来自 nums1&#xff0c;第二个元素来自 nums2 。 请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。 示例 1:…