[C++]栈队列改成模板类

栈、队列都更改成模板类

.hpp
#ifndef MY_STACK_H
#define MY_STACK_H
#include <iostream>using namespace std;template<typename T>
class my_stack
{
private:T *base;//动态栈指针int top;//栈顶元素int size;//栈大小
public:my_stack();//无参构造my_stack(T size):top(-1),size(size){base = new T[this->size];cout<<"有参构造"<<endl;}~my_stack(){delete []base;cout<<"析构函数"<<endl;}//赋值my_stack<T> & operator=(const my_stack<T> &str);//访问栈顶元素T my_top();//检查容器是否为空bool my_empty();//返回容纳元素数T my_size();//插入栈顶void my_push(T value);//删除栈顶void my_pop();
};//赋值
template<typename T>
my_stack<T> & my_stack<T>::operator=(const my_stack<T> &str)
{if(this != &str){delete []base;this->size = str.size;this->top = str.top;base = new int[size];for(int i = 0;i<size;i++){base[i] = str.base[i];}}return *this;
}//访问栈顶元素
template<typename T>
T my_stack<T>::my_top()
{if(my_empty()){cout<<"栈为空"<<endl;return -1;}return base[top];
}//检查容器是否为空
template<typename T>
bool my_stack<T>::my_empty()
{return top == -1;
}//返回容纳元素数
template<typename T>
T my_stack<T>::my_size()
{return top+1;
}
//插入栈顶
template<typename T>
void my_stack<T>::my_push(T value)
{if(top >= size){cout<<"栈满"<<endl;return;}base[++top] = value;cout<<value<<"插入成功"<<endl;
}
//删除栈顶
template<typename T>
void my_stack<T>::my_pop()
{if(my_empty()){cout<<"栈为空"<<endl;return;}top--;cout<<"删除栈顶成功"<<endl;
}#endif // MY_STACK_H
主程序
#include "my_stack.hpp"
int main()
{my_stack<int> s(10);s.my_push(23);s.my_push(45);s.my_push(74);cout<<"栈顶 = "<<s.my_top()<<endl;cout<<"栈元素个数="<<s.my_size()<<endl;s.my_pop();cout<<"删除栈顶后栈元素个数="<<s.my_size()<<endl;return 0;
}
队列
.hpp
#ifndef QUEUE_H
#define QUEUE_H
#include <iostream>using namespace std;template<typename T>
class queue
{
private:T *base;//队列动态数组int front;//头部int rear;//尾部int size;//容器大小
public:queue();//无参构造queue(T size):front(0),rear(0),size(size)//有参构造{base = new T[size];cout<<"有参构造"<<endl;}//析构函数~queue(){delete [] base;cout<<"析构函数"<<endl;}//赋值queue<T> &operator=(const queue<T> &str);//访问第一个元素T my_front();//访问最后一个元素T my_back();//检查容器是否为空bool my_empty();//返回容器的元素数T my_size();//向队尾插入元素void my_push(T value);//删除首个插入元素void my_pop();
};//赋值
template<typename T>
queue<T> & queue<T>::operator=(const queue<T> &str)
{if(this != &str){delete []base;front = str.front;rear = str.rear;size = str.size;base = new int[size];for(int i = front;i<rear;i++){base[i] = str.base[i];}}return *this;
}
//访问第一个元素
template<typename T>
T queue<T>::my_front()
{if(my_empty()){cout<<"队列为空"<<endl;return -1;}return base[front];
}
//访问最后一个元素
template<typename T>
T queue<T>::my_back()
{if(my_empty()){cout<<"队列为空"<<endl;return -1;}return base[rear-1];
}
//检查容器是否为空
template<typename T>
bool queue<T>::my_empty()
{return rear == front;
}
//返回容器的元素数
template<typename T>
T queue<T>::my_size()
{return rear-front;
}
//向队尾插入元素
template<typename T>
void queue<T>::my_push(T value)
{base[rear++] = value;cout<<"插入成功"<<endl;
}
//删除首个插入元素
template<typename T>
void queue<T>::my_pop()
{if(my_empty()){cout<<"队列为空"<<endl;return;}cout<<"首元素"<<base[front++]<<"删除成功"<<endl;
}#endif // QUEUE_H
主程序
#include "queue.hpp"int main()
{queue<int> s(10);s.my_push(14);s.my_push(24);s.my_push(41);s.my_push(4);cout<<"最后一个元素是"<<s.my_back()<<endl;s.my_pop();cout<<"第一个元素"<<s.my_front()<<endl;return 0;
}
顺序表
.hpp
#ifndef SEQLIST_H
#define SEQLIST_H#include <iostream>
#include <cstring>
using namespace std;
template<typename T>
class My_string
{
private:T *ptr; //顺序表字符数组int size = 15;     //数组的最大int len;  //数组的实际长度public:My_string();    //无参构造//有参构造My_string(const T* src);My_string(T num,T value);//拷贝构造My_string(const My_string &other);//拷贝赋值My_string &operator = (const My_string &other);//析构函数~My_string();bool empty();      //判空void push_back(T value); //尾插void pop_back(); //尾删T listsize();  //求长度T & at(T inex);  //获取任意位置元素void clear();//清空T *data();//返回C风格字符串T get_length();//返回当前最大容器void show();         //展示void append(const T *ptr);//扩容const My_string operator+(const My_string &other)const;//+运算符重载T &operator[](T n);//[]运算符重载bool operator>(const My_string &R)const;//>重载bool operator<(const My_string &R)const;//<重载bool operator==(const My_string &R)const;//==重载bool operator>=(const My_string &R)const;//>=重载bool operator<=(const My_string &R)const;//<=重载bool operator!=(const My_string &R)const;//!=重载My_string &operator +=(const My_string &R);//+=重载friend ostream &operator<<(ostream &L,const My_string &R);friend istream &operator>>(istream &L, My_string &R);
};template<typename T>
My_string<T>::My_string():size(15)     //无参构造
{this->ptr = new char[size];this->ptr[0] = '\0';this->len = 0;
}
//有参构造
template<typename T>
My_string<T>::My_string(const T* src)
{len = strlen(src)+1;size = len >size?size*2:size;this->ptr = new char[size];strcpy(ptr,src);
}
template<typename T>
My_string<T>::My_string(T num,T value)
{size = num >size?size*2:size;ptr = new char[size];for(int i = 0;i<num;i++){this->ptr[i] = value;}this->len = num;
}
//拷贝构造
template<typename T>
My_string<T>::My_string(const My_string &other):ptr(new char[other.size]),size(other.size),len(other.len)
{strcpy(this->ptr,other.ptr);this->size = other.size;this->len = other.len;
}
//拷贝赋值
template<typename T>
My_string<T> &My_string<T>::operator = (const My_string<T> &other)
{if(this != &other){delete []ptr;size = other.size;ptr = new char[size + 1];strcpy(ptr,other.ptr);}return *this;
}
//析构函数
template<typename T>
My_string<T>::~My_string()
{delete []ptr;
}
template<typename T>
T *My_string<T>::data()//返回C风格字符串
{return ptr;
}
//判空
template<typename T>
bool My_string<T>::empty()
{return ptr[0] == 0;
}//尾插
template<typename T>
void My_string<T>::push_back(T value)
{this->ptr[len++] = value;
}//尾删
template<typename T>
void My_string<T>::pop_back()
{if(this->empty()){cout<<"表为空无删除对象"<<endl;return;}this->len--;
}
//求长度
template<typename T>
T My_string<T>::listsize()
{return this->len;
}
//获取任意位置元素
template<typename T>
T & My_string<T>::at(T index)
{if(this->empty()){throw std::out_of_range("表为空无对象");}if(index>this->len||index<=0){throw std::out_of_range("位置错误");}return this->ptr[index-1];
}//展示
template<typename T>
void My_string<T>::show()
{if(this->empty()){cout<<"表为空无对象"<<endl;return;}cout<<"当前顺序表中的元素是:";cout<<"ptr = "<<ptr<<" ";len = strlen(ptr);cout<<"len = "<<len<<endl;
}
template<typename T>
T My_string<T>::get_length()//返回当前最大容器
{return this->size;
}template<typename T>
void My_string<T>::clear()//清空
{delete []ptr;ptr = new char[1];ptr[0] = '\0';len = 0;
}template<typename T>
void My_string<T>::append(const T *src)
{int src_len = strlen(src);while(len+src_len >= size){size *= 2;char *new_ptr = new char[size];strcpy(new_ptr,ptr);delete []ptr;ptr = new_ptr;}strcat(ptr,src);len += src_len;
}template<typename T>
const My_string<T> My_string<T>::operator+(const My_string<T> &other)const//+运算符重载
{My_string temp;delete []temp.ptr;temp.len =this->len+other.len;temp.ptr = new char(temp.len+1);strcpy(temp.ptr,this->ptr);strcat(temp.ptr,other.ptr);return temp;}template<typename T>
T &My_string<T>::operator[](T n)//[]运算符重载
{if(n<0||n>len){cout<<"数组越界"<<endl;}else{return ptr[n-1];}
}template<typename T>
bool My_string<T>::operator>(const My_string<T> &R)const//>重载
{return strcmp(this->ptr,R.ptr)>0;
}template<typename T>
bool My_string<T>::operator<(const My_string<T> &R)const//<重载
{return strcmp(this->ptr,R.ptr)<0;
}template<typename T>
bool My_string<T>::operator==(const My_string<T> &R)const//==重载
{return strcmp(this->ptr,R.ptr)==0;
}template<typename T>
bool My_string<T>::operator>=(const My_string<T> &R)const//>=重载
{return strcmp(this->ptr,R.ptr)>=0;
}template<typename T>
bool My_string<T>::operator<=(const My_string<T> &R)const//<=重载
{return strcmp(this->ptr,R.ptr)<=0;
}template<typename T>
bool My_string<T>::operator!=(const My_string<T> &R)const//!=重载
{return strcmp(this->ptr,R.ptr)!=0;
}template<typename T>
My_string<T> &My_string<T>::operator +=(const My_string<T> &R)//+=重载
{My_string temp;temp.ptr = new char(len+1);strcpy(temp.ptr,this->ptr);temp.len = this->len;delete [] ptr;this->ptr = new char(temp.len+R.len+1);strcpy(ptr,temp.ptr);strcat(ptr,R.ptr);return  *this;
}#endif // SEQLIST_H
 主程序
 
#include "seqlist.hpp"
int main()
{My_string<char> s1("Hello");//拷贝构造My_string<char> s2 = s1;s2.show();//无参构造My_string<char> s3;//拷贝赋值s3 = s1;s3.show();s3.push_back('a');//C字符风格cout<<s3.data()<<endl;s3.pop_back();s3.append(" world ,good");s3.show();//求实际长度cout<<"s3容器的实际长度 = "<<s3.listsize()<<endl;cout<<"s3容器的最大长度 = "<<s3.get_length()<<endl;cout<<"s3容器2号元素= "<<s3.at(2)<<endl;//clears3 = s2+s1;s3.show();cout<<"s3[2]= "<<s3[2]<<endl;My_string<char> s4("good");return 0;
}

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

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

相关文章

【工具类】证书自动续签免费版 正式发布

证书自动续签免费版 正式发布 1.控制台首页2.申请证书2.1.支持自动解析和手动解析两种模式2.2.LB&#xff08;负载均衡&#xff09;支持主流的云厂商2.3.CDN&#xff08;内容分发&#xff09; 支持主流的云厂商2.4.对象存储&#xff08;OSS&#xff09;支持主流云厂商2.5DCDN&a…

Linux云计算 |【第四阶段】RDBMS1-DAY2

主要内容&#xff1a; 常用函数&#xff08;函数分类1&#xff1a;单行、分组&#xff1b;函数分类2&#xff1a;字符、数学、日期、流程控制&#xff09;、分组查询group by、连接查询 一、常用函数 1. 按使用方式分类 ① 单行函数 单行函数&#xff08;Scalar Functions&…

manim页面中不规则分割整个人页面。

界面中的分割方式 在信息设计中&#xff0c;我们常常需要通过分割设计的方式来对信息进行分组&#xff0c;界面中的分割方式大致分为三种&#xff1a;卡片、线条、留白。 界面中的分割方式主要可以分为以下几种&#xff1a; 一、根据规则进行分割&#xff1a; 规则网格分割&…

游戏如何对抗改包

游戏改包是指通过逆向分析手段及修改工具&#xff0c;来篡改游戏包内正常的设定和规则的行为&#xff0c;游戏包被篡改后&#xff0c;会被植入/剔除模块进行重打包。 本期图文我们将通过实际案例分析游戏改包的原理&#xff0c;并分享游戏如何应对改包问题。 安卓平台常见的改…

大数据的挑战是小文件

小文件可能会给存储平台及其支持的应用程序带来大问题。在 Google 上搜索 “small files performance” 会产生 2M 的结果。这篇博文将更深入地研究小文件问题&#xff0c;深入研究其根源并总结解决方案。 问题陈述 出于本讨论的目的&#xff0c;小文件通常被视为小于 64 KB …

蓝桥杯【物联网】零基础到国奖之路:十二. TIM

蓝桥杯【物联网】零基础到国奖之路:十二. TIM 第一节 理论知识第二节 cubemx配置 第一节 理论知识 STM32L071xx器件包括4个通用定时器、1个低功耗定时器&#xff08;LPTIM&#xff09;、2个基本定时器、2个看门狗定时器和SysTick定时器。 通用定时器&#xff08;TIM2、TIM3、…

32 C 语言指针的长度与运算(指针加减整数、指针自增自减、同类型指针相减、指针的比较运算)

目录 1 指针的长度 2 指针与整数的加减运算 3 指针自增与自减 4 同类型指针相减 5 指针的比较运算 6 测试题 1 指针的长度 在 C 语言中&#xff0c;sizeof 运算符可以用来计算指针的长度。指针的长度实际上与指针所指向的数据类型无关&#xff0c;而是与系统的位数&…

怎么通过AI大模型开发一个网站?

目录 一、提示词与AI输出 二、网站效果 以前不会代码开发&#xff0c;写网站是不可能的事情&#xff0c;现在有了AI&#xff0c;一切都有了可能。以下是我通过通义千问大模型开发的简单网站。 一、提示词与AI输出 提示词1 你是python程序员&#xff0c;我有一个大的需求&am…

Charles(青花瓷)抓取https请求

文章目录 前言Charles&#xff08;青花瓷&#xff09;抓取https请求 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&…

QTreeview model过滤

QTreeview model数据过滤&#xff1a;大小写区分&#xff0c;对列过滤&#xff0c;对子对象过滤 示例&#xff1a; 需要自定义QSortFilterProxyModel, //自定义过滤model mProxyModel new TreeFilterProxyModel(this); //添加treeview当前model mProxyModel->setSource…

re轻松拆分四则运算expression(^从头匹配、(?:xxxx)非捕获组、| 交替运算符联合演习)

与ai对抵聊“算式匹配”&#xff0c;发现^从头匹配、(?:xxxx)非捕获组、| “交替”运算符联合使用的妙处。 (笔记模板由python脚本于2024年09月27日 18:35:32创建&#xff0c;本篇笔记适合喜欢python喜欢正则的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;…

云栖实录 | 开源大数据全面升级:Native 核心引擎、Serverless 化、湖仓架构引领云上大数据发展

本文根据2024云栖大会实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a; 王 峰 | 阿里云智能集团研究员、开源大数据平台负责人 李 钰&#xff5c;阿里云智能集团资深技术专家 范 振&#xff5c;阿里云智能集团高级技术专家 李劲松&#xff5c;阿里云…

Flume入门到实践--Flume的安装与基础概念与安装实战

在当今大数据时代&#xff0c;有效管理和处理海量日志数据对于企业获取洞察和保持运营效率至关重要。为此目的设计的强有力工具之一是 Apache Flume。本文将带您探索Flume&#xff0c;了解其功能、安装方法以及一些实际用例&#xff0c;以展示其在处理日志数据方面的有效性。 …

逻辑回归(中):数学公式学习笔记 LaTeX 版

背景 闲来无事翻了一下之前买的一个机器学习课程及之前记录的网络笔记&#xff0c;发现遇到公式都是截图&#xff0c;甚至是在纸上用笔推导的。重新整理一遍之前逻辑回归函数的学习笔记&#xff0c;主要是为了玩一下 LaTex 语法&#xff0c;写公式挺有意思的。 整理之前三篇笔…

机器学习-SVM

线性感知机分类 支持向量机 线性感知机&#xff08;Perceptron&#xff09; 感知机是线性二值分类器。 注意&#xff1a;什么是线性&#xff1f;线性分割面就是&#xff0c;就是在分割面中&#xff0c;任意两个的连线也在分割面中&#xff0c;这个分割面&#xff0c;就是线…

debian linux 只安装mysql client

查询系统版本 执行cat /etc/os-release 可以看到是debian11 rootservice-headquarters-hg-self-data-report-844ccf78b-6ls7t:/mysql#cat /etc/os-release PRETTY_NAME"Debian GNU/Linux 11 (bullseye)" NAME"Debian GNU/Linux" VERSION_ID"11&quo…

DOM元素导出图片与PDF:多种方案对比与实现

背景 在日常前端开发中&#xff0c;经常会有把页面的 DOM 元素作为 PNG 或者 PDF 下载到本地的需求。例如海报功能&#xff0c;简历导出功能等等。在我们自家的产品「代码小抄」中&#xff0c;就使用了 html2canvas 来实现代码片段导出为图片&#xff1a; 是不是还行&#xff…

【STM32】SPI回顾

一、定义 SPI是Motorola首先提出的全双工四线同步串行外围接口&#xff0c;采用主从模式&#xff08;Master-Slave&#xff09;架构。 二、单机与多机通信 4线SPI器件有四个信号&#xff1a;时钟(SPI CLK, SCLK)、主机输出从机输入(MOSI)、主机输入从机输出(MISO)、片选(CS/N…

简单理解C++在C的基础上的改变

1.C语言的一些不足 我们首先看下面用C语言实现栈 #include<stdio.h> #include<assert.h> #include<stdlib.h> typedef int StackDateType; typedef struct Stack {StackDateType* _ps;size_t _size;size_t _capacity; }Stack; void StackInit(Stack* ps) {…

Qt_网络编程

目录 1、Qt的UDP Socket 1.1 用Udp实现服务器 1.2 用Udp实现客户端 2、Qt的TCP Socket 2.1 用Tcp实现服务器 2.2 用Tcp实现客户端 3、Qt的HTTP 3.1使用Qt的HTTP 结语 前言&#xff1a; 网络协议是每个平台都必须遵守的&#xff0c;只是不同的平台所提供的网络API不…