使用模板构建泛型栈

news2024/11/25 11:39:22

目录

一.构造栈

使用构造函数

代码:

二.销毁栈

使用析构函数

代码

三.判空,判满

四.扩容

代码

五.入栈,出栈

代码

六.取栈顶元素

代码

代码合集

template< class T>模板

T为当前栈的数据类型

栈类型有三个属性:栈的空间大小,栈顶指针,以及用以存储元素的空间。

一.构造栈

使用构造函数

初始化栈类型的三个属性:设无任何元素的栈的栈顶指针为-1。

使用new关键字为栈申请空间大小。

new的作用:计算类型大小,malloc开辟空间,构造对象,将空间的地址返回

为了判断申请空间是否成功,需要判空。根据new的特性,我们不能直接使用nullptr去判空,因为new关键字出现异常会直接停止,系统跳出异常

代码:

Seqstack(int sz = STACK_INIT_SIZE) :_top(-1), _size{ sz }, _data{ nullptr }{
        _data = new(nothrow) T [sz];
        if (nullptr == _data) {
            exit(EXIT_FAILURE);
        }
    }

二.销毁栈

使用析构函数

因为用new关键字开辟空间,所以我们要用delete关键字收回空间并free

由于_data是一个数组,需要用delete[]去析构。

这里的构造函数和析构函数,小白认为和人的诞生死亡是相同的,可以这么简单认为。

当栈空间由系统收回后,_size空间大小变为0,栈顶指针指向最底。

代码

~Seqstack() {
        delete[]_data;
        _data = nullptr;
        _size = 0;
        _top = -1;
}

三.判空,判满

这里有任何疑问可以参考小白在数据结构处所写的栈。

int GetSize() {
        return _top + 1;
    }
    int GetCapth()  {
        return _size;
    }
    bool Empty() {
        return _top+1==0;
    }
    bool Full() {
        return _top+1==_size;
    }

四.扩容

这里注意两点:

1.开辟新数组后,新数组的长度是原来数组的2倍,而当你使用new关键字的时候,new关键字是没有将原先数组的值拷贝过去的功能,所以得使用内存函数,将内容一字节一字节拷贝过去。而原数组和新数组长度不一样,一定要注意这个,否则拷贝过去后,新数组的部分值是随机值。

如果用realloc函数就没有这么麻烦。

2.当把原先的数组拷贝完后,我们要把新开辟的数组返回给原数组,需要干的第一步就是把原先数组资源释放掉,然后把原数组里的元素删干净,并指向空,防止出现空悬指针。最后将新构建的赋值过去即可。

代码

new

bool Inc( ) {
        int newsize = STACK_INIT_SIZE * STACK_INC_SIZE;
        if (newsize <= _size)return true;
        //在这里注意 申请空间以2倍扩容
        T* newdata = new(nothrow)T [newsize];
        if (newdata == nullptr) {
            return false;
        }
        memmove(newdata, _data, sizeof(T) * GetSize());
        delete[]_data;
        _data = nullptr;
        _data = newdata;
        _size = STACK_INIT_SIZE * 2;
        return true;
    }

realloc

   bool Inc(size_t newsz)
    {
        if (newsz <= GetCapt())
        {
            return true;
        }
        T* newdata = (T*)realloc(_data, sizeof(T) * newsz);
        if (nullptr == newdata)return false;
        _data = newdata;
        _size = newsz;
        return true;
    }

五.入栈,出栈

这里没有什么难点。有问题的宝子可以去看看小白在数据结构处写的栈

代码

void Push(T val) {
        if (Full() && !Inc()) {
            return;
        }
        _data[++_top] = val;
    }
void Pop() {
        if (Empty()) {
            return;
        }
        _top--;
    }

六.取栈顶元素

这里我们使用引用将值返回,因为当函数结束后,函数所占的栈空间释放后,我们所建的栈还在,栈顶元素值仍在,所以可以使用引用去返回。

注意:引用返回:当返回的值受到函数调用结束影响,即存在僵亡值时,不能使用引用返回。不安全

同理我们也可以使用钓鱼的方式将取栈顶元素和出栈合二为一

代码

T& Top()const {
        return _data[_top];
    }
T& GetPop() {
        assert(_data != nullptr);
        return _data[_top--];
    }

代码合集

#include<iostream>
#include<cstring>
#include<assert.h>
using namespace std;
template<class T>
class Seqstack {
private:
    enum { STACK_INIT_SIZE = 10, STACK_INC_SIZE = 2 };
    T* _data;
    int _size;
    int _top;
public:
    Seqstack(int sz = STACK_INIT_SIZE) :_top(-1), _size{ sz }, _data{ nullptr }{
        _data = new(nothrow) T [sz];
        if (nullptr == _data) {
            exit(EXIT_FAILURE);
        }
    }
    ~Seqstack() {
        delete[]_data;
        _data = nullptr;
        _size = 0;
        _top = -1;
    }
    int GetSize() {
        return _top + 1;
    }
    int GetCapth()  {
        return _size;
    }
    bool Empty() {
        return _top+1==0;
    }
    bool Full() {
        return _top+1==_size;
    }
    bool Inc( ) {
        int newsize = STACK_INIT_SIZE * STACK_INC_SIZE;
        if (newsize <= _size)return true;
        //在这里注意 申请空间以2倍扩容
        T* newdata = new(nothrow)T [newsize];
        if (newdata == nullptr) {
            return false;
        }
        memmove(newdata, _data, sizeof(T) * GetSize());
        delete[]_data;
        _data = nullptr;
        _data = newdata;
        _size = STACK_INIT_SIZE * 2;
        return true;
    }
    void Push(T val) {
        if (Full() && !Inc()) {
            return;
        }
        _data[++_top] = val;
    }
    T& Top()const {
        return _data[_top];
    }
    void Pop() {
        if (Empty()) {
            return;
        }
        _top--;
    }
    T& GetPop() {
        assert(_data != nullptr);
        return _data[_top--];
    }
};
int main() {
    Seqstack<int> mys;
    for (int i = 1; i < 20; i++) {
        mys.Push(i);
    }
    int val_0 = 0;
    cout << mys.Top() << endl;
    while (!mys.Empty()) {
        val_0 = mys.GetPop();
        cout << val_0 << " ";
    }
    cout << endl;
    Seqstack<double> mys1;
    mys1.Push(12.23);
    mys1.Push(23.34);
    mys1.Push(34.45);
    mys1.Push(45.56);
    mys1.Push(67.78);
    mys1.Push(78.89); 
    mys1.Push(89.90); 
    mys1.Push(100.10);
    double val = 0.0;
    cout << mys1.Top() << endl;
    while (!mys1.Empty()) {
        val = mys1.GetPop();
        cout << val << " ";
    }
}

结果:

小白在数据结构中所写的顺序栈:Day 08顺序栈_早点打完工去睡觉的博客-CSDN博客

good good study,day day up!

 

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

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

相关文章

Linux:概述 、安装 、文件与目录结构 、vim编辑器 、网络配置 、远程登录 、系统管理 、基础命令 、软件包管理 、克隆虚拟机 、shell编程

1、课程介绍 2、Linux概述(入门篇) 2.1、Linux的诞生 2.1.1、Linux是什么? Linux是一个操作系统&#xff08;OS&#xff09; 所谓的操作系统就是直接用来操作计算机底层硬件的软件。 2.1.2、Linux的出现 2.2、Linux和Unix的渊源 2.3、GNU/Linux 2.4、Linux VS Windows 3、…

机器学习期末复习 决策树ID3的计算与构建

ID3构建的流程就是参考书上的那个伪代码。 1&#xff09; 开始&#xff1a;构建根节点&#xff0c;将所有训练数据都放在根节点&#xff0c;选择一个最优特征&#xff0c;按着这一特征将训练数据集分割成子集&#xff0c;使得各个子集有一个在当前条件下最好的分类。 2&#xf…

愿力,心力,能力

愿力&#xff0c;心力&#xff0c;能力 三力合一成点事 趣讲大白话&#xff1a;人与人的力量差别大 【趣讲信息科技165期】 *************************** 愿力是人文东方智慧 西方大概是mission使命之类 比如佛家发愿 儒家大概类似于立志 心力也是人文东方智慧 西方大概是意志…

51单片机(十七)红外遥控(外部中断)

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

基于ssm的汽车服务平台

基于ssm的汽车售后服务平台 快速链接 基于ssm的汽车售后服务平台功能模块技术栈硬件环境功能截图 功能模块 用户 注册功能&#xff1a;用户通过注册功能进行访问平台预约服务功能&#xff1a;用户可以预约服务预约记录查询&#xff1a;用户可以查询自己预约记录也可以进行修改…

AIGPT中文版(人人都能使用的GPT工具)生活工作的好帮手。

AIGPT简介 AIGPT是一款非常强大的人工智能技术的语言处理工具软件&#xff0c;它具有 AI绘画 功能、AI写作、写论文、写代码、哲学探讨、创作等功能&#xff0c;可以说是生活和工作中的好帮手。 我们都知道使用ChatGPT是需要账号以及使用魔法的&#xff0c;其中的每一项对我们…

【框架源码】Spring底层IOC容器加入对象的方式

1.Spring容器加入对象方式简介 使用XML配置文件 在XML配置文件中使用< bean >标签来定义Bean&#xff0c;通过ClassPathXmlApplicationContext等容器来加载并初始化Bean。 使用注解 使用Spring提供的注解&#xff0c;例如Component、Service、Controller、Repository等注…

学习Python的day.14

模块学习 什么是模块&#xff1a; 打开Python解释器&#xff0c;定义了data 1&#xff0c; 然后去访问data是可以访问到的&#xff1b;关闭Python解释器&#xff0c;再打开&#xff0c;再去访问data&#xff0c;访问不到了。 假设我有1000行的代码&#xff0c;在python解释器…

pv操作练习题

信号量解决五个哲学家吃通心面问题 题型一 有五个哲学家围坐在一圆桌旁&#xff0c;桌中央有盘通心面&#xff0c;每人面前有一只空盘于&#xff0c;每两人之间放一把叉子。每个哲学家思考、饥饿、然后吃通心面。为了吃面&#xff0c;每个哲学家必须获得两把叉子&#xff0c;…

【机器视觉1】坐标系定义

坐标系定义 1. 图像坐标系2. 摄像机坐标系3. 世界坐标系4. 三种坐标系间的转换4.1 摄像机坐标系与无畸变图像坐标系之间的变换4.2 世界坐标系与摄像机坐标系之间的变换4.3 世界坐标系与无畸变图像坐标系之间的变换 1. 图像坐标系 数字图像坐标系&#xff1a; O 0 − u v O_0-u…

【差分+操作】C. Helping the Nature

Problem - 1700C - Codeforces 题意&#xff1a; 思路&#xff1a; 一开始手玩了一下 如果不是高低高的形式&#xff0c;那么一定不能通过操作3把全部元素变成0 因此就是先把所有元素变成高低高的形式 但是低在什么地方不确定 因此考虑枚举中间低谷位置&#xff0c;O(1)计…

【多微电网】基于粒子群优化算法的面向配电网的多微电网协调运行与优化(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

软件测试岗,4轮成功拿下字节 Offer,面试题复盘(附答案)

一共经历了四轮面试&#xff1a;技术4面&#xff0b;HR面。 特整理出所涉及的全部知识点&#xff0c;并复盘了完整面试题及答案&#xff0c;分享给大家&#xff0c;希望能够帮到一些计划面试字节的朋友。 一、测试基础理论类 怎么编写案例?软件测试的两种方法测试结束的标准…

allegro查看板子元器件的pin脚总数

怎么在ALLEGRO里统计焊盘和包括芯片pin和阻容的pad&#xff1f; 板子要拿出去布&#xff0c;需要根据焊盘计费&#xff1f; 方法一&#xff1a; 在find里面只勾选pin&#xff0c;然后鼠标左键&#xff0c;选择全部的pin 再选择菜单Display–element&#xff0c;如下图&#x…

Vivado综合属性系列之三 RAM_STYLE

目录 一、前言 二、RAM_STYLE ​ ​2.1 工程代码 ​ ​2.2 参考资料 一、前言 ​ ​RAM英文全称为Random Access Memory&#xff0c;随机存取存储器&#xff0c;可以实现数据的快速随机读写&#xff0c;RAM可直接verilog代码编写&#xff0c;也可调用IP核。 二、RAM…

Nginx 安装配置

Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。在高连接并发的情况下&#xff0c;Nginx是Apache服务器不错的替代品。 Nginx 安装 系统平台&#xff1a;CentOS …

Java-Thread知识点汇总

什么是线程 记得小时候的电脑老是很卡,打开一个浏览器、游戏啥的老是卡死&#xff0c;关又关不掉&#xff0c;然后就会打开任务管理器&#xff0c;强制关闭它 我们可以看到&#xff0c;这个叫“进程”&#xff0c;简单理解一下&#xff0c;进程就是由&#xff08;一个或多个&am…

入河排污口设置论证报告书如何编制?入河排污口水质影响预测方法有哪些

随着水资源开发利用量不断增大&#xff0c;全国废污水排放量与日俱增&#xff0c;部分河段已远远超出水域纳污能力。近年来,部分沿岸入河排污口设置不合理&#xff0c;超标排污、未经同意私设排污口等问题逐步显现&#xff0c;已威胁到供水安全、水环境安全和水生态安全&#x…

Bootstrap开发之——Bootstrap简介(01)

一 概述 Bootstrap概念学习前需要具备知识查阅Bootstrap文档Bootstrap各版本有什么不同 二 Bootstrap概念 Bootstrap是一个使用HTML、CSS和JavaScript框架的前端开发框架Bootstrap 是全球最受欢迎的前端框架&#xff0c;用于构建响应式、移动设备优先的网站简洁、直观、强悍的…

Linux-基础指令-3

时间相关的指令 date显示 date 指定格式显示时间&#xff1a; date %Y:%m:%d 例子&#xff1a; 而上述中的 %Y %m %d 等等这些中间可以用很多的符号来分割&#xff0c; 如&#xff1a;" - " " _ " " : " 等等这些都是可以的&#xff0c;但是…