C++:采用模板封装顺序表,栈,队列

1.顺序表:

list.hpp

#ifndef LIST_HPP
#define LIST_HPP
#include <iostream>using namespace std;template <class L>class Seqlist
{
private:L *ptr;L size;L len=0;public:void init(L n){//堆区申请空间(大小为n)this->ptr=new L[n];//bzero(this->ptr,sizeof(L)*n);this->len=0;this->size=n;//}bool empty(){return this->len==0;}bool full(){return this->len==this->size;}void push_back(L e)//尾插{if(this->full()){return ;}this->ptr[len++]=e;}//插入void insert(L index,L num){if(full()){return;}for(L i=len-1;i>=index-1;i--){ptr[i+1]=ptr[i];}ptr[index-1]=num;len++;}//任意位置删除void erase(L index){if(empty()){return;}for(L i=index;i<len;i++){ptr[i-1]=ptr[i];ptr[i]=NULL;}len--;}//尾删void pop_back(){if(empty()){return;}ptr[len-1]=NULL;len--;}void show(){//判空if(len==0){return;}cout<<"顺序表"<<endl;for(int i=0;i<len;i++){cout<<ptr[i]<<ends;}cout<<endl;}//当前长度L cur_size(){if(empty()){return 0;}else{return len;}}L at(L index){L num;num=ptr[index-1];return num;}void sort(bool flag){if(flag){for(int i=1;i<len;i++){for(int j=0;j<len-i;j++){if(ptr[j]>ptr[j+1]){L temp;temp=ptr[j];ptr[j]=ptr[j+1];ptr[j+1]=temp;}}}}else{for(int i=1;i<len;i++){for(int j=0;j<len-i;j++){if(ptr[j]<ptr[j+1]){L temp;temp=ptr[j];ptr[j]=ptr[j+1];ptr[j+1]=temp;}}}}}};
#endif // LIST_HPP

2.栈:

strack.hpp

#ifndef STACK_HPP
#define STACK_HPP#include <iostream>
#include <exception>
using namespace std;template <class T>
class StackNode
{
public:T data;//存储数据StackNode *next;//指向下一个节点//构造函数StackNode(T d):data(d),next(nullptr){}};
template <class T>
class Stack
{
private:StackNode<T> *top;//指向栈顶int len;//栈中元素数量public:Stack():top(nullptr),len(0){}//析构函数~Stack(){while(!empty()){pop();}}bool empty() //判断栈是否为空{return top==nullptr;}int size()//获取栈的大小{return len;}//压栈操作void push(T element){StackNode<T>  *newnode=new StackNode<T>(element);//申请空间并初始化newnode->next=top;top=newnode;len++;}//出栈操作T pop(){if(empty()){throw out_of_range("空栈");}StackNode<T>  *temp=top;T value=top->data;top=top->next;delete temp;len--;return value;}//查看栈顶元素T look_top(){if(empty()){throw out_of_range("空栈");}return top->data;}//清空栈void clear(){while (!empty()){pop();}}Stack& operator=(const Stack& other){if (this != &other){clear(); // 清空当前栈// 复制元素StackNode<T>  *current = other.top;while (current != nullptr){push(current->data);current = current->next;}}return *this;}void swap(Stack& other){StackNode<T> * tempTop = top;top = other.top;other.top = tempTop;T templen = len;len = other.len;other.len = templen;}
};#endif // STACK_HPP

3.队列:

queue.hpp

#ifndef QUEUE_H
#define QUEUE_H#include <iostream>
#include <exception>
using namespace std;template <class T>
class QueueNode
{
public:T data;QueueNode *next;//有参构造QueueNode(T d):data(d),next(nullptr){}
};
template <class T>
class Queue
{
private:QueueNode<T>* front; // 指向队列头部的指针QueueNode<T>* rear;  // 指向队列尾部的指针int count;        // 队列中元素的数量public:// 构造函数Queue() : front(nullptr), rear(nullptr), count(0){}~Queue(){clear();}void clear(){while (front != nullptr){QueueNode<T>* temp = front;front = front->next;delete temp;}rear = nullptr;count = 0;}// 查看队列前端元素T frontElement(){if (empty()){throw std::out_of_range("空队列");}return front->data;}// 查看队列尾部元素T backElement(){if (empty()){throw std::out_of_range("空队列");}return rear->data;}//判断队列是否为空bool empty(){return front == nullptr;}// 获取队列的大小int size(){return count;}// 入队操作void push(T element){QueueNode<T>* newNode = new QueueNode<T>(element);if (rear == nullptr)  // 队列为空{front = rear = newNode;} else{rear->next = newNode;rear = newNode;}count++;}// 出队操作T pop(){if (empty()) {throw std::out_of_range("空队列");}QueueNode<T>* temp = front;T dequeuedValue = front->data;front = front->next;if (front == nullptr) {rear = nullptr;}delete temp;count--;return dequeuedValue;}void swap(Queue& other) {using std::swap;swap(front, other.front);swap(rear, other.rear);swap(count, other.count);}Queue& operator=(const Queue& other){if (this != &other){Queue temp(other); // 临时对象,用于深拷贝swap(temp); // 与临时对象交换内容}return *this;}};
#endif // QUEUE_H

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

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

相关文章

博主回归!数据结构篇启动

目录 1>>闲话 2>>数据结构前言 3>>复杂度的概念 4>>时间复杂度 5>>大O渐进表示法 6>>总结 1>>闲话 家人们好久不见&#xff0c;小编军训终于是结束了&#xff0c;大一事情太多了&#xff0c;这几天没时间健身&#xff0c;没时间…

2024.9.26 作业 +思维导图

一、作业 1、什么是虚函数&#xff1f;什么是纯虚函数 虚函数&#xff1a;函数前加关键字virtual&#xff0c;就定义为虚函数&#xff0c;虚函数能够被子类中相同函数名的函数重写 纯虚函数&#xff1a;把虚函数的函数体去掉然后加0&#xff1b;就能定义出一个纯虚函数。 2、基…

el-table+el-form实现表单校验和解决不垂直居中导致的问题

el-tableel-form实现表单校验 1.实现el-table的表单校验 关键点123 2.解决不垂直居中导致的问题 问题效果图 解决方案 .item-align-center {display: inline-flex; }

数据定义语言CREATE的应用

新书速览|SQL Server 2022从入门到精通&#xff1a;视频教学超值版_sql server 2022 出版社-CSDN博客 《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) SQL Se…

IGZO基底无电容DRAM单元前景看好

1.DRAM技术简介 DRAM&#xff08;Dynamic Random Access Memory&#xff0c;动态随机存取存储器&#xff09;是一种用于计算机和其他电子设备中的主存储器类型&#xff0c;其主要由存储单元阵列构成&#xff0c;而每一个存储单元由一个电容器和一个晶体管组成&#xff0c;如图…

EasyAR自定义相机RTSP视频流(CustomCamera)

EasyAR可以使用视频源作为输入源&#xff0c;官方给出了示例和文档&#xff0c;但是对于大部分Unity开发人员来说看了文档还是一头雾水。 在Android Studio中将custom-camera.jar添加libs中&#xff0c;就可以查看源代码了 分析其源代码&#xff0c;主要是ExternalCameraSampl…

AI数字人直播爆火,数字人虚拟主播成品牌闲时直播最佳选择!

近年来&#xff0c;随着互联网的普及和发展&#xff0c;电商和直播平台在我国迅速崛起。根据中国网络信息中心的数据显示&#xff0c;我国直播用户7.5亿&#xff0c;使用率已经超过70%&#xff0c;直播已经成为企业重要的营销和销售通道。 一、在经历了几年的爆发式增长后&…

日期类的实现- 计算日期之间相差多少天-解决单参数构造

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 这里有坑&#xff0c;这里有坑&#xff0c;这里有坑 首选我们直接上代码&#xff0c;因…

Unity场景内画车道线(根据五阶曲线系数)

之前做过使用Dreamteck Splines插件构建车道线之前需求是给定车道线的点位&#xff0c;根据点位来进行构建。 由于AI识别出来的点位不线性&#xff0c;画出来的车道线经常是歪七扭八&#xff0c;所以使用五阶曲线系数进行构建。 使用在线图形计算器进行测试构建&#xff0c;公式…

【C++】STL标准模板库容器set

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;关联式容器set(集合)简介 &#x1f4cc;set(集合)的使用 &#x1f38f;set(集合)的模板参数列表 &#x1f38f;set(集合)的构造函数 &#x1f38f;set(集合)的迭代…

Vue 项目实战4-无缝轮播图

养成好习惯&#xff0c;先赞后看&#xff0c;感谢对作者大大的支持 一、话不多说&#xff0c;直接上效果图&#xff1a; 完整视频展示链接如下&#xff1a; https://item.taobao.com/item.htm?ftt&id833405684191 二、实现思路 HTML结构 文档头部设置&#xff1a;定义…

C# 委托(Delegate)二

一.委托的多播&#xff08;Multicasting of a Delegate&#xff09;&#xff1a; 委托对象&#xff0c;使用 "" 运算符进行合并&#xff0c;一个合并委托调用它所合并的两个委托。使用"-" 运算符从合并的委托中移除组件委托。 注&#xff1a;只有相同类型…

C语言编译和链接详解(通俗易懂,深入本质)

我们平时所说的程序,是指双击后就可以直接运行的程序,这样的程序被称为可执行程序(Executable Program)。在 Windows 下,可执行程序的后缀有.exe和.com(其中.exe比较常见);在类 UNIX 系统(Linux、Mac OS 等)下,可执行程序没有特定的后缀,系统根据文件的头部信息来判…

小小扑克牌算法

1.定义一个扑克牌类Card&#xff1a; package democard; public class Card {public String suit;//表示花色public int rank;//表示牌点数Overridepublic String toString() {return "{"suit rank"}";}//实例方法&#xff0c;初始化牌的点数和花色public…

Redis篇(初识Redis)

目录 一、数据库 二、NoSQL 三、认识Redis 三、关系数据库与非关系数据库对比 1. 结构化与非结构化 2. 关联和非关联 3. 查询方式 4. 事务 5. 存储方式 6. 扩展性 7. 总结 7.1. 图形梳理 7.2. 表格梳理 7.3. 优缺点 关系型数据库 非关系型数据库 四、再次认识R…

word中的表格全部设置宽度100%

1、背景 我们用工具将数据库或其他的数据导出成word时&#xff0c;表格有的会大于100%&#xff0c;超过了边界。word没有提供全局修改的方法。如果我们想改成100%。 一种方式是通过宏&#xff0c;全局改。一种是手动改。 2、宏修改 如果表格多&#xff0c;可以通过这种方式。…

【Qt】前后端交互---DataCenter类

设计目的 前后端交互系统中&#xff0c;创建并使用数据核心类的目的就是让该类作为客户端的数据中心&#xff0c;也就是说其负责管理客户端的所有数据与服务器的网络通信。 数据持久化 初始化数据文件 该函数设计的目的就是用于检查所需要的文件和目录是否存在&#xff0c;如…

You are not allowed to push code to this project

原因1 用户权限不够。 具体查看用户权限路径&#xff1a; 原因2 vscode之前都能提交代码&#xff0c;但是突然就提交不上了。 表现为:前端代码能拉取&#xff0c;但是不能提交。使用idea进行前端代码的提交&#xff0c;完全没问题。 解决方案&#xff1a;修改TortoiseG…

新160个crackme - 066-Andrnalin.3

运行分析 文字是德语&#xff0c;需要破解Key PE分析 VB程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 使用 VB Decompiler 静态分析&#xff0c;发现逻辑如下&#xff1a;1、提取Key每个字符 102、计算后的Key要与"kXy^rO|yXom\kMuOn*"相等 算法分析…

25 基于51单片机的温度电流电压检测系统(压力、电压、温度、电流、LCD1602)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;通过DS18B20检测温度&#xff0c;滑动变阻器连接数模转换器模拟电流、电压&#xff0c;通过LCD1602显示&#xff0c;程序里设置温度阈值为40&#xff0c;电流阈值为60&am…