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日

相关文章

  • C++实现简单五子棋游戏

    C++实现简单五子棋游戏攻略 简介 五子棋是一种非常经典的棋类游戏,如何用C++实现一个简单的五子棋游戏呢?本篇攻略将为大家提供一份完整的实现方案。 步骤 1. 游戏界面 首先,我们需要设计一个游戏界面。可以考虑使用图形界面库来实现,也可以使用控制台进行文字输出。 示例代码: void printBoard(vector<vector<char&…

    C 2023年5月23日
    00
  • C++用easyx图形库实现障碍跑酷小游戏

    使用easyx图形库实现障碍跑酷小游戏 简介 障碍跑酷是一种常见的小游戏类型,玩家需要在游戏中控制一个角色不断向前奔跑,躲避各种障碍物,并收集道具以提高得分。本篇攻略将介绍如何使用C++语言和easyx图形库实现一个简单的障碍跑酷小游戏。 环境 本攻略的实现环境为Windows,使用的开发工具为Visual Studio和EasyX图形库。可以在EasyX的…

    C 2023年5月22日
    00
  • 详解C++中的ANSI与Unicode和UTF8三种字符编码基本原理与相互转换

    下面是详解C++中的ANSI与Unicode和UTF8三种字符编码基本原理与相互转换的攻略。 一、字符编码的概念 字符编码是将字符集中的每个字符映射到某个二进制值的一种方法。常见的字符编码方式包括ASCII、ANSI、Unicode和UTF-8等。 ANSI编码指的是使用单字节表示每个字符的编码方式,它的编码范围是0-127,这种编码方式主要在早期的计算机和…

    C 2023年5月23日
    00
  • C++实现比较日期大小的示例代码

    让我来为您深入讲解一下“C++实现比较日期大小的示例代码”的完整攻略。 前置知识 在了解如何使用 C++ 实现比较日期大小之前,我们需要了解以下基础概念:时间戳和结构体。 时间戳是指自 1970 年 1 月 1 日 00:00:00 UTC 至现在的总秒数。在 C++ 中,我们可以使用 time_t 类型来表示时间戳。 结构体是由一系列不同类型的数据组成的自…

    C 2023年5月23日
    00
  • C++控制台实现密码管理系统

    为了编写C++控制台实现密码管理系统,我们需要遵循以下步骤: 步骤1:设计数据结构 设计数据结构是密码管理系统的第一步,我们需要确定各种密码信息的存储方式。我们可以选择使用结构体、类或数组来存储不同的用户信息。 例如: struct Password{ char username[15]; char password[15]; char descriptio…

    C 2023年5月23日
    00
  • C语言中的窗口滑动技术

    C语言中的窗口滑动技术详解 窗口滑动技术介绍 窗口滑动技术指的是在一段连续的数据流中,以固定大小的窗口对数据进行处理的技术。在C语言中,窗口滑动技术常用于数据压缩、数据加密、错误检测等领域。 窗口滑动技术实现 C语言中,实现窗口滑动技术通常使用循环结构和指针。下面是一段实现基础窗口滑动的示例代码: char buffer[1024]; int window_…

    C 2023年5月9日
    00
  • C语言实现的学生选课系统代码分享

    C语言实现的学生选课系统代码分享 简介 本文将分享一份用C语言实现的学生选课系统代码,该系统实现了学生的选课、退课、成绩查看等功能。通过学习本系统的代码,可以加深对C语法及数据结构的理解。 功能模块 学生选课系统包含了以下几个功能模块: 学生信息管理 课程信息管理 学生选课 学生退课 成绩查询 数据结构 该系统使用了以下数据结构: 结构体:用于存储学生信息、…

    C 2023年5月23日
    00
  • C++你最好不要做的几点小结

    以下是“C++你最好不要做的几点小结”的完整攻略。 C++你最好不要做的几点小结 1. 不要忘记初始化 C++中未初始化的变量是具有未定义值的,如果试图使用未初始化的变量,将会导致不可预知的结果。因此,在使用变量之前,一定要初始化。对于内建类型,可以使用默认值进行初始化,例如: int a = 0; // 将a初始化为0 bool b = false; //…

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