C++模版类实现栈

text.h

#ifndef TEXT_H
#define TEXT_H#include <stdexcept> // 用于 std::out_of_rangetemplate <typename T>
class MyStack {
private:T* data;         // 指向底层数组的指针int capacity;    // 容量int top;         // 栈顶索引int size;        // 当前元素数量void resize(int new_capacity); // 扩容函数public:// 无参构造函数MyStack();// 有参构造函数MyStack(int initial_capacity);// 拷贝构造函数MyStack(const MyStack& other);// 赋值运算符MyStack& operator=(const MyStack& other);// 析构函数~MyStack();// 访问第一个元素T& front();// 访问最后一个元素T& back();// 检查栈是否为空bool is_empty() const;// 返回栈的元素数量int get_size() const;// 尾插void push(const T& value);// 尾删void pop();// 在尾部原位置构造元素template<typename... Args>void emplace_back(Args&&... args);// 删除首个元素void pop_front();// 交换内容void swap(MyStack& other);};#include "text.cpp" // 包含实现文件#endif // TEXT_H

text.cpp

#include "text.h"// 无参构造函数
template <typename T>
MyStack<T>::MyStack() : capacity(10), top(-1), size(0) {data = new T[capacity]; // 动态分配初始容量
}// 有参构造函数
template <typename T>
MyStack<T>::MyStack(int initial_capacity) : capacity(initial_capacity), top(-1), size(0) {data = new T[capacity]; // 动态分配指定容量
}// 拷贝构造函数
template <typename T>
MyStack<T>::MyStack(const MyStack& other) : capacity(other.capacity), top(other.top), size(other.size) {data = new T[capacity]; // 动态分配新数组for (int i = 0; i <= top; i++) {data[i] = other.data[i]; // 复制元素}
}// 赋值运算符
template <typename T>
MyStack<T>& MyStack<T>::operator=(const MyStack& other) {if (this != &other) { // 防止自赋值delete[] data; // 释放原有内存capacity = other.capacity;top = other.top;size = other.size;data = new T[capacity]; // 动态分配新数组for (int i = 0; i <= top; i++) {data[i] = other.data[i]; // 复制元素}}return *this; // 返回当前对象
}// 析构函数
template <typename T>
MyStack<T>::~MyStack() {delete[] data; // 释放动态分配的内存
}// 访问第一个元素
template <typename T>
T& MyStack<T>::front() {if (is_empty()) {throw std::out_of_range("Stack is empty");}return data[0]; // 返回第一个元素
}// 访问最后一个元素
template <typename T>
T& MyStack<T>::back() {if (is_empty()) {throw std::out_of_range("Stack is empty");}return data[top]; // 返回最后一个元素
}// 检查栈是否为空
template <typename T>
bool MyStack<T>::is_empty() const {return size == 0; // 如果元素数量为0,返回true
}// 返回栈的元素数量
template <typename T>
int MyStack<T>::get_size() const {return size; // 返回当前元素数量
}// 尾插
template <typename T>
void MyStack<T>::push(const T& value) {if (size >= capacity) {resize(capacity * 2); // 扩容为原来的两倍}data[++top] = value; // 插入新元素size++; // 更新元素数量
}// 尾删
template <typename T>
void MyStack<T>::pop() {if (is_empty()) {throw std::out_of_range("Stack is empty");}top--; // 移除栈顶元素size--; // 更新元素数量
}// 在尾部原位置构造元素
template <typename T>
template<typename... Args>
void MyStack<T>::emplace_back(Args&&... args) {if (size >= capacity) {resize(capacity * 2); // 扩容为原来的两倍}data[++top] = T(std::forward<Args>(args)...); // 原位置构造元素size++; // 更新元素数量
}// 删除首个元素
template <typename T>
void MyStack<T>::pop_front() {if (is_empty()) {throw std::out_of_range("Stack is empty");}for (int i = 0; i < top; i++) {data[i] = data[i + 1]; // 移动元素}top--; // 移除首个元素size--; // 更新元素数量
}// 交换内容
template <typename T>
void MyStack<T>::swap(MyStack& other) {std::swap(data, other.data);std::swap(capacity, other.capacity);std::swap(top, other.top);std::swap(size, other.size);
}// 扩容函数
template <typename T>
void MyStack<T>::resize(int new_capacity) {T* new_data = new T[new_capacity]; // 动态分配新数组for (int i = 0; i <= top; i++) {new_data[i] = data[i]; // 复制旧数据}delete[] data; // 释放旧内存data = new_data; // 更新指针capacity = new_capacity; // 更新容量
}

main.cpp

#include <iostream>
#include "text.h"using namespace std;int main() {MyStack<double> stack; // 创建一个整型栈// 尾插元素stack.push(99.99);stack.push(10.11);stack.push(88.88);stack.push(66.66);std::cout << "输出最后一个元素 " << stack.back() << std::endl;std::cout << "输出第一个元素 " << stack.front() << std::endl;std::cout << "输出长度 " << stack.get_size() << std::endl;// 删除首个元素stack.pop_front();std::cout << "输出删除后的第一个元素 " << stack.front() << std::endl;// 尾删元素stack.pop();std::cout << "删除后的最后一个元素 " << stack.back() << std::endl; // 交换内容MyStack<double> stack2;stack2.push(4.99);stack2.push(1.11);stack.swap(stack2);std::cout << "输出交换后的stack的最后一个元素 " << stack.back() << std::endl; std::cout << "输出交换后的stack2的最后一个元素 " << stack2.back() << std::endl; return 0;
}

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

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

相关文章

基于Hive和Hadoop的图书分析系统

本项目是一个基于大数据技术的图书分析系统&#xff0c;旨在为用户提供全面的图书信息和深入的图书销售及阅读行为分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以…

光耦合器在信号传输和隔离中的作用

光耦合器&#xff0c;也称为光隔离器&#xff0c;是电子电路中的关键元件&#xff0c;它结合了两个基本功能&#xff1a;信号传输和电气隔离。它们允许信号在电路的不同部分之间传递&#xff0c;同时保持它们彼此电气隔离。此功能对于保护敏感的低压控制电路免受更高电压、噪声…

群晖套娃:群晖+飞牛fnOS二合一,群晖nas安装飞牛fnOS系统实录(飞牛fnOS初体验,如何挂载网盘视频,轻松实现影视刮削)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 飞牛fnOS 📒📝 什么是飞牛fnOS?📝 准备工作📝 安装飞牛fnOS📝 影视刮削⚓️ 相关链接 ⚓️📖 介绍 📖 最近有一款很火的国产NAS系统吸引了不少用户的注意。你是否曾想过,将这种新兴系统安装到你的群晖设备上,实…

“数字武当”项目荣获2024年“数据要素×”大赛湖北分赛文化旅游赛道一等奖

9月26日&#xff0c;由国家数据局、湖北省人民政府指导的首届湖北省数据要素创新大会暨2024年“数据要素”大赛湖北分赛颁奖仪式在湖北武汉举行。由大势智慧联合武当山文化旅游发展集团有限公司参报的武当山“数字武当”项目&#xff0c;荣获文化旅游赛道一等奖。 据悉&#x…

一次阿里云ECS免费试用实践

必坑指南 域名注册了&#xff0c;但是试用版无法完成ICP认证的流程 外网不能访问&#xff0c;推荐使用香港地区–自己就是坑在了杭州 阿里云的网站界面有点太复杂了&#xff0c;经常找不到自己想要的界面 为什么使用ECS ECS 一个在云端的弹性计算服务器。 可以支持对外公网映…

VBA技术资料MF205:移动工作表时名称重复的处理

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

AIGC: 10 AI转文服务器的搭建过程记录

上图是台风席卷城市&#xff0c;现在企业的服务基本都是混合部署&#xff0c;云计算厂商的机房往往可以提供比较好的保护&#xff0c;一般在地下&#xff0c;扛多少级地震&#xff0c;扛多少级台风&#xff0c;而自建机房&#xff0c;往往写字楼经常停电&#xff0c;网络运营上…

Spring:强制登陆与拦截器

1.只使用session验证 &#xff08;1&#xff09;第一步&#xff1a;用户登陆时存储session ApiOperation("用户登陆") PostMapping("/login") public AppResult login(HttpServletRequest request,RequestParam("username") ApiParam("用…

计算机毕业设计之:基于uni-app的校园活动信息共享系统设计与实现(三端开发,安卓前端+网站前端+网站后端)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Python学习(3):画散点图和箱线图

1. 散点图&#xff08;matplotlib库&#xff09; 1.1 代码示例 import matplotlib.pyplot as plt# 准备数据 x [1, 2, 3, 4, 5] y [2, 4, 6, 8, 10]# 绘制散点图 plt.scatter(x, y)# 添加标题和标签 plt.title("散点图示例") plt.xlabel("X 轴") plt.y…

BaseCTF2024 web

Web [Week1] HTTP 是什么呀 GET: ?basectf%77%65%31%63%25%30%30%6d%65POST: BaseflgX-Forwarded-For:127.0.0.1Referer: BaseCookie: c00k13i cant eat itUser-Agent: Base有Location跳转, 抓包得到flag: QmFzZUNURntkZGUzZjA0Yy1hMDg5LTQwNGMtOTFjNi01ODZjMzAxMzM3Y2J9Cg…

【数据结构中的哈希】

泛黄的春联还残留在墙上.......................................................................................................... 文章目录 前言 一、【哈希结构的介绍】 1.1【哈希结构的概念】 1.2【哈希冲突】 1.3【哈希函数的设计】 1.4【应对哈希冲突的办法】 一、…

Unity图形用户界面!*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。(万字解析)

Unity 3D GUI 简介 游戏开发过程中&#xff0c;开发人员往往会通过制作大量的图形用户界面&#xff08; Graphical User Interface&#xff0c;GUI &#xff09;来增强游戏与玩家的交互性。 Unity 3D 中的图形系统分为 OnGUI、NGUI、UGUI等&#xff0c;这些类型的图形系统内容…

[大语言模型-论文精读] ACL2024-长尾知识在检索增强型大型语言模型中的作用

ACL2024-长尾知识在检索增强型大型语言模型中的作用 On the Role of Long-tail Knowledge in Retrieval Augmented Large Language Models Authors: Dongyang Li, Junbing Yan, Taolin Zhang, Chengyu Wang, Xiaofeng He, Longtao Huang, Hui Xue, Jun Huang 1.概览 问题解决&…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【LMS调测】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 LMS全称为Lite Memory Sanitizer&#xff0c;是一种实时…

建立分支提交代码

git分支 git branch 产看当前分支 git branch -a 查看所有分支 git checkout 分支名 切换分支 git checkout -b 分支名 建立分支&#xff08;仅仅是在本地建立了&#xff0c;并没有关联线上&#xff09; git push --set-upstream origin 分支名 把本地分支推到先线上 gti add …

自定义认证过滤器和自定义授权过滤器

目录 通过数据库动态加载用户信息 具体实现步骤 一.创建数据库 二.编写secutity配置类 三.编写controller 四.编写服务类实现UserDetailsService接口类 五.debug springboot启动类 认证过滤器 SpringSecurity内置认证流程 自定义认证流程 第一步:自定义一个类继承Abstra…

信息技术网络安全政策制定

为什么要制定网络安全政策&#xff1f; 通常&#xff0c;公司并不认为需要制定网络安全政策。现有的政策是为了保护公司的资产&#xff0c;而数据也是一项资产。 网络安全政策的真正必要性很简单&#xff1a;网络安全并不像锁门或不偷公司笔那么简单。在许多情况下&#xff0…

前海石公园的停车点探寻

前海石公园是真的很美&#xff0c;很多看海人&#xff0c;很多钓鱼佬&#xff0c;很多抓螃蟹的人&#xff0c;很多挖沙子的人&#xff0c;很多拍照的人&#xff0c;尤其是没有大太阳的时间段或每天傍晚或每个放假的时候人气超高&#xff0c;故前海石公园停车真的很紧张。由于前…

Unreal Engine 5 C++: 编辑器工具编写入门01(中文解释)

目录 准备工作 1.创建插件 2.修改插件设置 快速资产操作&#xff08;quick asset action) 自定义编辑器功能 0.创建编辑器button&#xff0c;测试debug message功能 大致流程 详细步骤 1.ctrlF5 launch editor 2.创建新的cpp class&#xff0c;derived from AssetAction…