c++堆栈类模板实现

2023-11-14

最近在复习数据结构,涉及到堆栈的实现,通过类模板可以使堆栈的存储数据类型更为灵活,下面是堆栈的实现代码:

#ifndef MYSTACK_H
#define MYSTACK_H
#include <iostream>
using namespace std;

template <typename T>
class MyStack
{
public:
	MyStack(int size);
	~MyStack();
	bool stackEmpty();//判空
	bool stackFull();//判满
	void clearStack();//清空
	int stackLength();//长度
	bool push(T elem);//压栈
	bool pop(T &elem);//出栈
	bool stackTop(T &elem);//返回栈顶
	void stackTranverse();//遍历栈

private:
	T *m_pStack;//栈指针
	int m_iSize;//栈容量
	int m_iTop;//栈顶
};

template <typename T>
MyStack<T>::MyStack(int size)
{
	m_iSize = size;
	m_pStack = new T[m_iSize];
	m_iTop = 0;
}
template <typename T>
MyStack<T>::~MyStack()
{
	delete m_pStack;
	m_pStack = NULL;
}
template <typename T>
bool MyStack<T>::stackEmpty() {//判空
	return m_iTop == 0 ? true : false;
}
template <typename T>
bool MyStack<T>::stackFull() {//判满
	return m_iTop == m_iSize ? true : false;
}
template <typename T>
int MyStack<T>::stackLength() {//栈长度
	return m_iTop;
}
template <typename T>
void MyStack<T>::clearStack() {//清空
	m_iTop = 0;
}
template <typename T>
bool MyStack<T>::push(T elem) {//压栈
	if (stackFull()) {
		return false;
	}
	else {
		m_pStack[m_iTop++] = elem;
		return true;
	}
}
template <typename T>
bool MyStack<T>::pop(T &elem) {//出栈
	if (stackEmpty())
	{
		return false;
	}
	else {
		elem = m_pStack[--m_iTop];
		return true;
	}
}
template <typename T>
bool MyStack<T>::stackTop(T &elem) {//返回栈顶元素
	if (stackEmpty())
	{
		return false;
	}
	else {
		elem = m_pStack[m_iTop-1];
		return true;
	}
}
template <typename T>
void MyStack<T>::stackTranverse() {//遍历栈
	int i = 0;
	for (i = 0; i < m_iTop; i++) {
		cout << m_pStack[i];
	}
}
#endif

其中需要注意的是类模板需要在每个函数之前写上模板定义template <typename T>,并且将类名写成MyStack<T>,函数中涉及到类的使用时用T代替即可。

接着我用一个坐标点类Coordinate来做测试:

在Coordinate类中利用函数重载运算符<<实现坐标点的打印

#include <ostream>
using namespace std;

class Coordinate
{
public:
	friend ostream& operator<<(ostream &out, Coordinate &coor);
	Coordinate(int x=0,int y=0)
	{
		m_iX = x;
		m_iY = y;
	}

	~Coordinate()
	{
	}
private:
	int m_iX;
	int m_iY;
};
ostream& operator<<(ostream &out, Coordinate &coor) {
	out << "(" << coor.m_iX << "," << coor.m_iX << ")" << endl;
	return out;
}


下面是测试主函数:


#include <iostream>
#include "MyStack.h"
#include "Coordinate.h"
using namespace std;

int main() {
	MyStack<Coordinate> *pStack = new MyStack<Coordinate>(5);

       pStack->push(Coordinate(3, 5));//坐标点入栈
	pStack->push(Coordinate(7, 5));
	pStack->push(Coordinate(6, 5));
	pStack->push(Coordinate(4, 5));
	pStack->push(Coordinate(3, 5));
	
	pStack->stackTranverse();//遍历栈
	Coordinate t;
	pStack->pop(t);//出栈
	cout <<"弹出的t为:"<< t ;
	cout << "长度:" << pStack->stackLength();
	pStack->clearStack();//清空栈
	pStack->stackTranverse();

       //delete pStack;
	//pStack = NULL;

	system("pause");
	return 0;
}



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++堆栈类模板实现 的相关文章

  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • Java入门项目——读书管理系统

    Java简单实现读书管理系统 一 前言 二 思路及整体框架 三 代码展示 1 有关读书包 Book 2 有关用户包 3 有关操作书的包 一 前言 相信有很多小伙伴学习完了 JavaSE 基础语法 想知道自己到底学的怎么样 或则学完不知道这么
  • 使用RT-Thread studio 把LVGL移植到RT-Thread 上

    使用RT Thread studio 移植 LVGL到RT Thread中 其实RT Thread 移植LVGL 官方已经出来很多教程 但是但是他出的教程都是基于一些他们适配的BSP 但是其他不适配的怎么办呢 当然是手搓了 前期准备 1 在
  • 深入理解Golang之Map

    目录 写在前面 哈希表 如何解决哈希冲突的问题 1 链表地址法 2 开放地址法 开放地址 线性探测法 开放地址 平方探测法 开放地址 双哈希 Go Map实现 map数据结构 map的结构体为hmap bmap结构体 map的桶 Map扩容
  • 【使用JMeter 对Web服务器压力测试】

    自己使用JMeter测试百度心得 主要用到了 1 添加线程组 一个测试的线程容器 可设置线程个数 循环次数 所有线程启动一次的周期时间 2 在线程组 中添加sample gt http request 一个请求的范式 可以设置请求的url和
  • 关于单个模型切片

    这几天鼓捣了模型切片 遇到好多坑 特此记录 1 切片切什么 切的是模型 模型可以通过Nodevisitor转换为geode 而geode可以分为若干drawable 切的就是这些drawable 因此 要node gt accept vis
  • APP更新机制-静默更新、弱更新、强更新/portal是什么?

    APP更新机制 静默更新 弱更新 强更新 一 静默更新 1 1 功能解释 静默更新就是手机系统悄悄的更新 一般会是用户在应用市场勾选了Wifi状态下 闲时自动更新功能后 手机系统会按它的规则帮用户自动更新APP 这个功能和用户手动去应用市场
  • vue 校验表单报错:model is required for validate to wor

    参考https blog csdn net qq 45376290 article details 107346110 1 属性绑定错误 确保绑定的是 model 而不是v model model 是element ui 里面的一个 属性
  • 压缩感知 热身实验 OMP算法Python实现(详细代码注释)

    压缩感知实验 OMP算法Python实现 一维图信号重建 Experiment Result 一维图信号重建 coding utf 8 Created on Wed Sep 23 21 46 43 2020 author chen impo
  • GetLastError返回值及其含义

    GetLastError返回的值通过在api函数中调用SetLastError或SetLastErrorEx设置 函数并无必要设置上一次错误信息 所以即使一次GetLastError调用返回的是零值 也不能担保函数已成功执行 只有在函数调用
  • dhcp和vrrp技术

    目录 引言 一 DHCP工作原理与配置 1 DHCP 动态主机配置协议 2 DHCP工作原理 3 dhcp配置 同网段 4 dhcp中继 不同同网段 5 例子 二 vrrp作用配置 1 vrrp作用 2 vrrp配置 总结 引言 我们每台电
  • Android系统裁剪:手把手教你如何进行系统裁剪

    内容有点长 想系统裁剪 这篇文章足矣 看完会对系统裁剪及系统有更深的认识 前言 android系统裁剪优化一直是各个厂商定制产品的关键步骤 包括浅层次的去除不必要的apk android apk裁剪定制 和深层次的裁剪整个编译系统和框架层
  • 跨境外贸必看

    Pinterest是一个海外图片社交分享网站 Pinterest与国内小红书的营销方式非常相似 它允许我们定位特定的人群 兴趣甚至位置 借助庞大的用户群体和针对特定受众的能力 它成为外贸与跨境电商的推广营销利器 越来越多的跨境玩家利用它进行
  • 虚拟机opnsense作为dhcp服务器,在OPNsense中,通过主机名或域名访问内部设备

    在局域网环境中 使用域名来访问防火墙或其他设备比使用IP地址更容易让人使用 根据需要 我们可以只使用主机名 服务器 来访问设备上的各种服务 例如文件共享 它比包含域名的名称要短 如果打算运行Web服务器或运行具有Web界面的软件 则可能需要
  • Faster RCNN训练自己的数据集【傻瓜式教程】

    一 下载源码 本文采用的源码是 https github com dBeker Faster RCNN TensorFlow Python3 二 配置环境 由于本文是小白教程 光写几个环境怕有人配置不好或者配置版本搞乱 Faster RCN
  • ELK之Elasticsearch常用DSL语句(kibana语句)

    DSL 是什么 DSL Domain Specific Language 的缩写 中文翻译为领域特定语言 Wikipedia 对于 DSL 的定义还是比较简单的 A specialized computer language designe
  • 8.2.3-elasticsearch内置分词器之keyword/pattern

    ES默认提供了八种内置的analyzer 针对不同的场景可以使用不同的analyzer 1 keyword analyzer 1 1 keyword类型及分词效果 keyword analyzer视字符串为一个整体不进行分词处理 测试key
  • Java多线程编程基础篇(二)-多线程同步关键字

    一 多线程同步关键字 synchronized 1 概念 synchronized保证方法或者代码块在运行时 同一时刻只有一个方法可以进入到临界区 同时它还可以保证共享变量的内存可见性 当多个并发线程访问同一个对象object中的同步代码块
  • mysql 用户流失_利用SQL对平台用户行为进行分析

    一 提出问题 1 平台的用户流失情况是怎样的 2 造成该种流失情况是原因是什么 二 理解数据 1 数据来源 https tianchi aliyun com dataset dataDetail dataId 649 userId 1 本数
  • svn 新建文件不能直接提交终于解决了

    preface 一直在做的一个项目最近要上线了 之前一直遗留了一个 svn 问题 新创建的文件不能 直接在外层目录直接提交 只能一级一级 的先添加目录 然后添加目录中的文件 最后在外层目录提交 因为写得东西太多 总不可避免的 会有遗漏提交
  • c++堆栈类模板实现

    最近在复习数据结构 涉及到堆栈的实现 通过类模板可以使堆栈的存储数据类型更为灵活 下面是堆栈的实现代码 ifndef MYSTACK H define MYSTACK H include