C++堆栈类模板实现代码

C++中的堆栈类是一种常用的数据结构,可以实现后进先出(LIFO)的数据存储和处理方式。

下面是一个C++堆栈类模板的实现代码攻略,主要包括以下几个方面:

  1. 堆栈类模板的定义和实现

堆栈类模板由两个部分组成:头文件(.h文件)和源文件(.cpp文件)。

头文件中需要包含以下内容:

  • 头文件保护宏定义,避免重复引用。
  • 类定义,定义堆栈类模板及其成员函数。
  • 类成员,包括存储堆栈数据、堆栈大小、堆栈容量等成员变量,以及对应的入栈、出栈、扩展、判断栈是否为空等成员函数。

以下是一个完整的头文件示例:

#ifndef STACK_H
#define STACK_H

template<typename T>  // 类型参数T为任意数据类型
class Stack {
public:
    // 构造函数
    Stack(int size = 1024);  // 堆栈默认大小为1024个元素

    // 析构函数
    ~Stack();

    // 判断堆栈是否为空
    bool IsEmpty() const;

    // 判断堆栈是否已满
    bool IsFull() const;

    // 元素入栈
    void Push(const T& item);

    // 元素出栈
    T Pop();

private:
    T* data_;  // 用于存储堆栈元素的数组指针
    int size_;  // 堆栈大小
    int top_;   // 堆栈顶部指针

    // 扩展堆栈容量
    void Resize(int size);
};

template<typename T>
Stack<T>::Stack(int size)
    : size_(size), top_(-1)
{
    data_ = new T[size];
}

template<typename T>
Stack<T>::~Stack()
{
    delete[] data_;
}

template<typename T>
bool Stack<T>::IsEmpty() const
{
    return top_ == -1;
}

template<typename T>
bool Stack<T>::IsFull() const
{
    return top_ == size_ - 1;
}

template<typename T>
void Stack<T>::Push(const T& item)
{
    if (IsFull()) {
        Resize(size_ * 2);
    }
    data_[++top_] = item;
}

template<typename T>
T Stack<T>::Pop()
{
    if (IsEmpty()) {
        throw std::out_of_range("stack is empty");  // 抛出异常
    }
    return data_[top_--];
}

template<typename T>
void Stack<T>::Resize(int size)
{
    T* new_data = new T[size];
    for (int i = 0; i <= top_; ++i) {
        new_data[i] = data_[i];
    }
    delete[] data_;
    data_ = new_data;
    size_ = size;
}
#endif  // STACK_H

在头文件中,我们使用了类模板,即将一个或多个参数定义为类型形参,实现代码的复用。类型形参命名为T,可以是任何数据类型。类中还包含堆栈元素的存储数组指针T* data_,堆栈大小和堆栈顶部指针等成员变量,以及堆栈的各个实际操作函数,例如入栈函数Push()和出栈函数Pop()。

源文件的实现主要包括以下内容:

  • 头文件引用。
  • 实现类模板成员函数。

以下是一个完整的源文件示例:

#include "Stack.h"

// 函数实现

int main() {
    // 使用堆栈模板
    Stack<int> my_stack(5);  // 创建一个大小为5的整型堆栈

    my_stack.Push(1);
    my_stack.Push(2);
    my_stack.Push(3);
    my_stack.Push(4);
    my_stack.Push(5);

    while (!my_stack.IsEmpty()) {
        int item = my_stack.Pop();
        std::cout << item << " ";
    }

    return 0;
}

在源文件中,我们使用头文件中定义的堆栈类模板Stack实现一个整型堆栈。首先调用构造函数创建一个大小为5个元素的堆栈,然后往堆栈中依次压入1~5,最后依次执行弹出操作将元素出栈并输出。

  1. 示例说明

下面是一个完整的程序示例,包含头文件和源文件。

头文件Stack.h

#ifndef STACK_H
#define STACK_H

template<typename T>
class Stack {
public:
    Stack(int size = 1024);
    ~Stack();
    bool IsEmpty() const;
    bool IsFull() const;
    void Push(const T& item);
    T Pop();

private:
    T* data_;
    int size_;
    int top_;
    void Resize(int size);
};

template<typename T>
Stack<T>::Stack(int size)
    : size_(size), top_(-1)
{
    data_ = new T[size];
}

template<typename T>
Stack<T>::~Stack()
{
    delete[] data_;
}

template<typename T>
bool Stack<T>::IsEmpty() const
{
    return top_ == -1;
}

template<typename T>
bool Stack<T>::IsFull() const
{
    return top_ == size_ - 1;
}

template<typename T>
void Stack<T>::Push(const T& item)
{
    if (IsFull()) {
        Resize(size_ * 2);
    }
    data_[++top_] = item;
}

template<typename T>
T Stack<T>::Pop()
{
    if (IsEmpty()) {
        throw std::out_of_range("stack is empty");  // 抛出异常
    }
    return data_[top_--];
}

template<typename T>
void Stack<T>::Resize(int size)
{
    T* new_data = new T[size];
    for (int i = 0; i <= top_; ++i) {
        new_data[i] = data_[i];
    }
    delete[] data_;
    data_ = new_data;
    size_ = size;
}

#endif

源文件Main.cpp

#include <iostream>
#include "Stack.h"

int main() {
    // 使用堆栈模板
    Stack<int> my_stack(5);  // 创建一个大小为5的整型堆栈

    my_stack.Push(1);
    my_stack.Push(2);
    my_stack.Push(3);
    my_stack.Push(4);
    my_stack.Push(5);

    while (!my_stack.IsEmpty()) {
        int item = my_stack.Pop();
        std::cout << item << " ";
    }

    return 0;
}

在上面这个示例中,我们首先在头文件中定义了一个堆栈类模板,包括构造函数、析构函数、判断堆栈是否为空等函数。然后在源文件中调用堆栈类模板,实现了一个大小为5的整型堆栈,并往堆栈中依次压入1~5,最后依次执行弹出操作将元素出栈并输出。

另外,我们也可以使用堆栈类模板实现一个字符串堆栈。如下:

#include <iostream>
#include "Stack.h"

int main() {
    // 使用堆栈模板
    Stack<std::string> my_stack(3);  // 创建一个大小为3的字符串堆栈

    my_stack.Push("hello");
    my_stack.Push("world");
    my_stack.Push("!");

    while (!my_stack.IsEmpty()) {
        std::string item = my_stack.Pop();
        std::cout << item << " ";
    }

    return 0;
}

在上面这个示例中,我们定义了一个大小为3的字符串堆栈,并往堆栈中依次压入"hello"、"world"、"!"三个字符串,最后依次执行弹出操作将元素出栈并输出。

总之,使用C++堆栈类模板,可以方便地实现各种类型的LIFO数据结构,提高程序的代码复用性和效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++堆栈类模板实现代码 - Python技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • java jni调用c函数实例分享(java调用c函数)

    下面我将为您详细讲解“Java JNI调用C函数实例分享(Java调用C函数)”的攻略。 什么是JNI? JNI全称为Java Native Interface,即Java本地接口。它是一个开发者提供的桥梁,用于将Java虚拟机(JVM)连接到应用程序中的非Java代码(如C语言、C++等)。使用JNI可以使Java程序调用C语言等非java语言编写的代码或…

    C 2023年5月23日
    00
  • win下安装sqlmap的方法分享

    下面详细讲解 “win下安装sqlmap的方法分享” 的完整攻略,希望对你有帮助。 步骤一:下载和安装Python 首先要确保你的电脑上已经安装了Python,如果没有,需要在官网 https://www.python.org/downloads/ 下载最新版本的 Python,进行安装,安装时要记得勾选“Add Python to PATH”选项,这样后续…

    C 2023年5月23日
    00
  • C++11 shared_ptr 与 make_shared源码剖析详解

    C++11中的shared_ptr和make_shared是两个非常实用的特性,能够帮助我们更好地管理内存。本文将深入介绍shared_ptr和make_shared的实现原理,帮助读者更好地掌握这两个特性。 1. shared_ptr简介 shared_ptr是C++11提供的一种智能指针,用于管理动态内存。它可以自动对内存进行引用计数,并在引用计数为0时…

    C 2023年5月23日
    00
  • vue实现导入json解析成动态el-table树表格

    首先,我们需要导入所需的依赖。可以使用npm或者yarn命令安装相关依赖: npm install vue vue-router axios element-ui –save-dev 其中,vue是Vue.js框架核心库,vue-router用于路由管理,axios用于发起网络请求,element-ui用于构建UI组件。 接着,我们需要在Vue.js应用中…

    C 2023年5月23日
    00
  • 华为揽阅M2平板电脑做工怎么样?华为揽阅M2 10.0指纹平板拆机全过程图解

    华为揽阅M2是一款高性能的平板电脑,其外观和内部设计都十分精细,以下是关于此设备做工的详细分析以及拆机攻略。 华为揽阅M2平板电脑做工分析 外观设计 华为揽阅M2采用了一块10.1英寸的IPS触控屏幕,屏幕分辨率为1920*1200像素,支持10点触控和电磁笔输入。整个设备的外观采用了金属材质,手感舒适,整机重量为约500克。 在机身的四周布置了一些按钮、接…

    C 2023年5月22日
    00
  • 详解C/C++中低耦合代码的设计实现

    详解C/C++中低耦合代码的设计实现 在C/C++开发过程中,低耦合的代码设计和实现可以提高代码的可读性、可维护性和可重用性,更加适合大型项目的开发。下面我们将详细讲解如何实现低耦合的代码设计。 1. 引入头文件的精简化 在编写C/C++代码的时候,我们会引入许多头文件,这些头文件中可能包含了许多不必要的定义和声明。这些不必要的定义和声明会增加代码的耦合度。…

    C 2023年5月30日
    00
  • C语言实现自行车管理系统

    C语言实现自行车管理系统完整攻略 系统需求 本系统需要实现以下功能: 添加自行车信息 删除自行车信息 修改自行车信息 查找自行车信息 展示自行车信息 具体而言,自行车信息应该包含以下内容: 品牌 型号 轮径 颜色 价格 数据结构设计 为了实现以上功能,我们需要用到以下数据结构: struct bike { char brand[20]; char model…

    C 2023年5月23日
    00
  • C语言MFC导出dll回调函数方法详解

    C语言MFC导出dll回调函数方法详解 在C语言MFC程序开发中,可能会需要用到回调函数,用于向调用方传递处理结果。而MFC导出dll的方式,可以让我们在其他程序中使用该函数。下面是导出dll回调函数的详细攻略。 步骤1:定义回调函数 首先需要定义回调函数,在函数名前加上__declspec(dllexport)关键字。以下是一个示例: __declspec…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部