C语言利用模板实现简单的栈类

C语言利用模板实现简单的栈类

概述

本文介绍如何利用C语言中的模板来实现一个简单的栈类,使用者可以通过该类方便地进行基本的栈操作,比如入栈、出栈、查看栈顶元素等。

设计思路

栈是一种后进先出的数据结构,本文中我们采用单向链表的形式来实现栈,每个节点存储一个数据元素,同时每个节点还有个指向下一个节点的指针。栈的主要操作为入栈、出栈、查看栈顶元素,我们在代码中实现这些操作,同时通过模板形式定义栈类,使得栈可以处理不同类型的数据。

具体实现

首先,我们定义链表节点结构体 StackNode,如下:

template<typename T>
struct StackNode {
    T data;
    StackNode<T>* next;
    StackNode(T value) : data(value), next(NULL) {}
};

结构体包含一个模板类型的数据成员 data,一个指向下一个节点的指针成员 next,以及一个构造函数用于初始化数据成员。

接着,我们定义栈类 Stack,如下:

template<typename T>
class Stack {
public:
    Stack();
    ~Stack();
    bool empty() const;
    int size() const;
    void push(const T& value);
    void pop();
    T& top();
private:
    StackNode<T>* m_top;
    int m_size;
};

栈类包含一个指向栈顶节点的指针成员 m_top,以及一个整型成员 m_size 用于记录栈中元素的数量。其中,构造函数用于初始化指针成员和整型成员;析构函数用于释放栈中所有节点的内存,避免内存泄漏;空函数 empty 用于判断栈是否为空,如果栈为空则返回 true,否则返回 false;整型函数 size 用于返回栈的元素数量;函数 push 用于将元素入栈;函数 pop 用于将栈顶元素出栈;函数 top 用于返回栈顶元素的值。这些函数的具体实现如下:

template<typename T>
Stack<T>::Stack() : m_top(NULL), m_size(0) {}

template<typename T>
Stack<T>::~Stack() {
    StackNode<T>* current = m_top;
    while (current) {
        StackNode<T>* temp = current;
        current = current->next;
        delete temp;
    }
}

template<typename T>
bool Stack<T>::empty() const {
    return m_size == 0;
}

template<typename T>
int Stack<T>::size() const {
    return m_size;
}

template<typename T>
void Stack<T>::push(const T& value) {
    StackNode<T>* node = new StackNode<T>(value);
    node->next = m_top;
    m_top = node;
    ++m_size;
}

template<typename T>
void Stack<T>::pop() {
    if (m_size == 0) {
        return;
    }
    StackNode<T>* node = m_top;
    m_top = m_top->next;
    delete node;
    --m_size;
}

template<typename T>
T& Stack<T>::top() {
    return m_top->data;
}

最后,在代码中使用该栈类时,比如可以创建一个整型元素的栈并进行一些基本操作,示例如下:

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

int main() {
    Stack<int> s;
    std::cout << s.empty() << std::endl; // 输出 1
    s.push(1);
    s.push(2);
    s.push(3);
    std::cout << s.top() << std::endl; // 输出 3
    s.pop();
    std::cout << s.top() << std::endl; // 输出 2
    std::cout << s.size() << std::endl; // 输出 2
    return 0;
}

总结

本文介绍了如何利用C语言中的模板来实现一个简单的栈类,实现了栈的基本操作,同时通过模板形式定义栈类,使得栈可以处理不同类型的数据。读者可以根据需求进一步扩展栈类的功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言利用模板实现简单的栈类 - Python技术站

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

相关文章

  • JavaScript Tween算法及缓动效果

    JavaScript Tween算法及缓动效果可以让网页元素在运动过程中模拟出物理现象,使得动画更加自然流畅。本文将详细讲解Tween算法的原理和实现,以及常见的缓动效果。 什么是Tween算法 Tween算法又称为缓动算法,是一种基于物理现象模拟的动画算法。它的核心思想是在一定的时间内,根据当前的动画进度,计算出该时刻动画应该处于什么状态。Tween算法是…

    C 2023年5月22日
    00
  • C++浮点数类型详情

    下面来详细讲解一下C++浮点数类型的详情。 浮点数类型概述 在C++中,浮点数类型是一种用来表示实数的数据类型。它包括两个子类型:float和double。其中,float类型通常占用4个字节(32位),而double类型通常占用8个字节(64位)。 浮点数类型主要用于处理需要高精度小数计算或具有小数位的数据。但需要注意的是,在处理浮点数时,由于采用了二进制…

    C 2023年5月30日
    00
  • C 程序 查找前 n 个自然数的和

    程序说明 本程序是用 C 语言编写的,功能是查找前 n 个自然数的和。 程序的主要思路是利用循环结构来实现,通过逐个累加自然数的值来获得和。 程序代码 具体的代码如下所示: #include <stdio.h> int main() { int n, sum=0, i; printf("请输入一个正整数n:"); scanf(…

    C 2023年5月9日
    00
  • AI绘制一副潜水员深海冒险场景插画教程

    标题:AI绘制一副潜水员深海冒险场景插画教程 正文:本教程将介绍如何使用AI绘制一副潜水员深海冒险场景插画,具体步骤如下: 准备工作 下载并安装AI设计软件(如Adobe Illustrator) 准备相关素材(如潜水员图片、深海生物图片、海底场景图片等) 绘制潜水员 打开AI设计软件,并导入潜水员图片 选择画笔工具,对潜水员进行描边和填充操作,注意保留细节…

    C 2023年5月22日
    00
  • Ubuntu中为Android系统上实现内置C可执行程序测试Linux内核驱动程序

    以下是详细讲解“Ubuntu中为Android系统上实现内置C可执行程序测试Linux内核驱动程序”的完整攻略。 简介 在实现Android系统的过程中,需要通过内核驱动程序来实现硬件设备的访问和控制,而在开发内核驱动的过程中需要进行测试。本文将介绍如何在Ubuntu操作系统上测试Android系统的内核驱动程序。 步骤 1. 在Ubuntu操作系统中搭建开…

    C 2023年5月23日
    00
  • python非单一.py文件用Pyinstaller打包发布成exe

    下面是“Python非单一.py文件用Pyinstaller打包发布成exe”的完整攻略。 什么是Pyinstaller PyInstaller是一个Python应用程序的打包工具。它可以将Python程序打包成单个可执行文件,这让你可以方便地将Python程序发布给其他人,而不需要他们安装Python环境。 Pyinstaller的安装 在安装Pyinst…

    C 2023年5月22日
    00
  • C++中map和vector作形参时如何给定默认参数?

    C++中,map和vector是常用的STL容器之一,它们通常被用作函数的参数,但是有时候我们需要为这些参数设置默认值。本文将详细讲解C++中map和vector作为形参时如何给定默认参数的方法。 map作为形参时如何给定默认参数 为了设置map的默认参数,我们需要在函数声明中使用“=”运算符来给map参数设置默认值。下面是一个使用map的函数,并设置默认参…

    C 2023年5月23日
    00
  • Android Studio中通过CMake使用NDK并编译自定义库和添加预编译库

    下面是详细讲解: 1. 简介 NDK是Android开发中的一种工具,可以让开发者利用C/C++等语言来开发JNI(Java Native Interface)的代码,从而实现更高效的底层计算。 NDK本身是一个工具链,包括编译器(gcc/clang)和标准库等。在Android Studio中进行NDK开发,一般需要借助CMake和Gradle等工具进行项…

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