My_string 运算符重载,My_stack

思维导图

在这里插入图片描述

将My_string类中的所有能重载的运算符全部进行重载

+、[] 、>、<、==、>=、<=、!= 、+=(可以加等一个字符串,也可以加等一个字符)、输入输出(<< 、 >>)

My_string

my_string.h

#ifndef MY_STRING_H
#define MY_STRING_H#include <iostream>
#include <cstring>using namespace std;class My_string
{
private:char *ptr;         //指向字符数组的指针int size;           //字符串的最大容量int len;            //字符串当前容量public://无参构造My_string():size(20){cout<<"****************无参构造***********"<<endl;this->ptr = new char[size];this->ptr[0] = '\0';            //表示串为空串this->len = 0;}//有参构造My_string(const char* src){cout<<"****************一个参数有参构造***********"<<endl;this->len = strlen(src);this->size = len + 1;this->ptr = new char[size];strcpy(this->ptr,src);}My_string(int num,char value){cout<<"****************两个参数有参构造***********"<<endl;this->len = num;this->size = len + 1;this->ptr = new char[len+1];int i=0;while(i<num){this->ptr[i]=value;i++;}this->ptr[num]='\0';}//拷贝构造My_string (const My_string &other){cout<<"****************拷贝构造***********"<<endl;len = other.len;size = other.size;ptr = new char[size];strcpy(ptr, other.ptr);}//拷贝赋值My_string &operator=(const My_string &other){cout<<"****************拷贝赋值***********"<<endl;if (this == &other) {return *this;  // 直接返回当前对象}delete[] ptr;this->len = other.len;this->size = other.size;this->ptr = new char[size];strcpy(ptr, other.ptr);return *this;}//析构函数~My_string(){cout<<"****************析构函数***********"<<endl;delete []this->ptr;}//显示内容void show();//判空void isempty();//判满void isfull();//尾插void push_back(char value);//尾删void pop_back();//at函数实现char &at(int index);//清空函数void clear();//返回C风格字符串char* data();//返回实际长度int get_length();//返回当前最大容量int get_size();//君子函数:二倍扩容void resize();//自定义运算符重载 +const My_string operator+(const My_string &R){My_string temp;while(this->len+R.len>this->size){resize();}strcpy(temp.ptr,this->ptr);temp.ptr = strcat(temp.ptr,R.ptr);this->len = R.len+this->len;return temp;}//自定义运算符重载 []char  operator[](int n){return ptr[n];}// 重载大于运算符 (>)// 用于比较两个 My_string 对象,逐字符比较bool operator>(const My_string &R) const {int i = 0;// 逐字符比较当前对象和传入的对象,直到遇到字符串结束符 '\0'while (this->ptr[i] != '\0' && R.ptr[i] != '\0') {if (this->ptr[i] > R.ptr[i]) {// 如果当前对象的字符大于传入对象的字符,则返回 truereturn true;} else if (this->ptr[i] < R.ptr[i]) { // 如果当前对象的字符小于传入对象的字符,则返回 falsereturn false;}i++;}if (this->ptr[i] != '\0' && R.ptr[i] == '\0') {// 如果当前对象的字符串未结束,而传入对象的字符串已结束,返回 truereturn true;}return false;}// 重载小于运算符 (<)bool operator<(const My_string &R) const {return strcmp(this->ptr, R.ptr) < 0;}// 重载小于等于运算符 (<=)bool operator<=(const My_string &R) const {return strcmp(this->ptr, R.ptr) <= 0;}// 重载大于等于运算符 (>=)bool operator>=(const My_string &R) const {return strcmp(this->ptr, R.ptr) >= 0;}// 重载相等运算符 (==)bool operator==(const My_string &R) const {return strcmp(this->ptr, R.ptr) == 0;}// 重载不等运算符 (!=)bool operator!=(const My_string &R) const {return strcmp(this->ptr, R.ptr) != 0;}// 重载 += 运算符,用于将传入的字符串附加到当前字符串后My_string& operator+=(const My_string &R) {// 检查当前字符串的容量是否足够容纳新字符串,如果不够则调用 resize 扩展容量while (this->len + R.len >= this->size) {this->resize();}// 使用 strcat 将传入对象的字符串附加到当前对象的字符串后strcat(this->ptr, R.ptr);// 更新当前字符串的实际长度this->len = this->len + R.len;// 返回当前对象return *this;}// 重载输出运算符 <<friend ostream& operator<<(ostream &L, const My_string &R);};#endif // MY_STRING_H

my_string.cpp

#include "my_string.h"
#include <cstring>
void My_string::show(){cout<<ptr<<endl;
}
//判空
void My_string::isempty(){if(this->len==0){cout<<"字符串为空"<<endl;}return;
}
//判满
void My_string::isfull(){if(this->len>=this->size){cout<<"字符串满"<<endl;resize();cout<<"重新分配空间"<<endl;}else{cout<<"字符串未满"<<endl;}return;
}//尾插
void My_string::push_back(char value){this->isfull();this->ptr[len]=value;len++;ptr[len]='\0';
}//尾删
void My_string::pop_back(){this->len=this->len-1;ptr[len]='\0';
}
//at函数实现
char & My_string::at(int index){return ptr[index];
}
//清空函数
void My_string::clear(){ptr[0]='\0';this->len=0;
}//返回C风格字符串
char* My_string::data(){return this->ptr;  // 返回指向字符串的指针
}
//返回实际长度
int My_string::get_length(){return this->len;
}
//返回当前最大容量
int My_string::get_size(){return this->size;
}//君子函数:二倍扩容
void My_string::resize() {size *= 2;char* new_ptr = new char[size];strcpy(new_ptr, ptr);delete[] ptr;ptr = new_ptr;}ostream & operator<<(ostream &L,const My_string &R){L<<R.ptr;return L;
}

main.cpp

#include "my_string.h"int main(){My_string s1("ABCDEF");My_string s2("GHIJK");//重构 + 运算符My_string s3 = s1+s2;s3.show();//重构 [] 运算符cout<<s3[2]<<endl;cout<<"s1:"<<s1<<"   s2:"<<s2<<endl;//重构 > 运算符cout<<"s1"<<">"<<"s2?"<<endl;if(s1>s2){cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}//重构 < 运算符cout<<"s1"<<"<"<<"s2?"<<endl;if(s1<s2){cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}//重构 <= 运算符cout<<"s1"<<"<="<<"s2?"<<endl;if(s1<=s2){cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}//重构 >= 运算符cout<<"s1"<<">="<<"s2?"<<endl;if(s1>=s2){cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}//重构 == 运算符cout<<"s1"<<"=="<<"s2?"<<endl;if(s1==s2){cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}//重构 != 运算符cout<<"s1"<<"!="<<"s2?"<<endl;if(s1!=s2){cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}//重构 += 运算符cout<<"************************"<<endl;s1.show();s2.show();s1+=s2;s1.show();//重构<<运算符cout<<s1<<endl;}

仿照stack类实现my_stack,实现一个栈的操作

img

Mystack

My_stack.cpp

#include"My_stack.h"
using namespace std;
// 入栈操作
void My_Stack::push(int value) {if (top>=MAX_SIZE - 1) {cout<<"栈满!"<< value<<endl;return;}arr[++top] = value;  // 增加栈顶并赋值cout<<"入栈: "<<value<<endl;
}// 出栈操作
int My_Stack::pop() {if (isEmpty()) {cout << "栈空!" << endl;return -1;  // 返回 -1 作为错误指示}int pop = arr[top--];  // 返回栈顶值并减少栈顶索引cout << "出栈: " << pop << endl;return pop;
}// 获取栈顶元素
int My_Stack::peek() {if (isEmpty()) {cout << "栈空!" << endl;return -1;}return arr[top];  // 返回栈顶值
}// 判断栈是否为空
bool My_Stack::isEmpty() {return top == -1;  //则栈为空,栈顶索引为 -1
}// 获取栈的当前大小
int My_Stack::size() {return top + 1;  // 返回栈中元素的个数
}
void My_Stack::swap_t(My_Stack& other) {// 交换栈顶索引swap(top, other.top);// 交换栈中的内容for (int i = 0; i < MAX_SIZE; ++i) {swap(arr[i], other.arr[i]);}
}
// 显示栈中的内容
void My_Stack::show() {if (isEmpty()) {cout << "栈空!" << endl;return;}cout << "栈中的元素: ";for (int i = 0; i <= top; ++i) {cout << arr[i] << " ";  // 打印每个元素}cout << endl;
}

My_stack.h

#ifndef MY_STACK_H
#define MY_STACK_H
#include <iostream>using namespace std;class My_Stack {
private:static const int MAX_SIZE = 100;  // 定义栈的最大容量int arr[MAX_SIZE];  // 数组用于存储栈元素int top;  // 栈顶索引public:My_Stack():top(-1){}  // 构造函数My_Stack(const My_Stack& other):top(other.top) {//拷贝构造函数for (int i = 0; i <= top; ++i) {arr[i] = other.arr[i];  // 深拷贝}}~My_Stack(){}void push(int value);  // 入栈操作int pop();  // 出栈操作int peek();  // 获取栈顶元素bool isEmpty();  // 判断栈是否为空int size();  // 获取栈的当前大小void swap_t(My_Stack& other);void show();  // 显示栈中的内容My_Stack& operator=(const My_Stack& other){  // 赋值操作符重载if (this != &other) {  // 自我赋值检查top = other.top;  // 复制栈顶索引for (int i = 0; i <= top; ++i) {arr[i] = other.arr[i];  // 深拷贝}}return *this;  // 返回当前对象的引用}
};#endif // MY_STACK_H

main.cpp

#include "My_stack.h"int main() {// 创建第一个栈并进行入栈操作My_Stack s1;s1.push(10);s1.push(20);s1.push(30);// 创建第二个栈并进行入栈操作My_Stack s2;s2.push(40);s2.push(50);My_Stack s3 = s2;cout<<"s3:";s3.show();cout <<"交换前:"<< endl;cout<<"s1:";s1.show();cout<<"s2:";s2.show();// 交换s1和s2的内容s1.swap_t(s2);cout << "交换后:" << endl;cout<<"s1:";s1.show();cout<<"s2:";s2.show();// 出栈cout<<"从 s1 弹出元素: "<<s1.pop()<<endl;cout<<"从 s2 弹出元素: "<<s2.pop()<<endl;// 检查栈的大小cout<<"s1 当前大小: "<<s1.size()<<endl;cout<<"s2 当前大小: "<<s2.size()<<endl;// 再次弹出元素s1.pop();s2.pop();cout << "交换后再次弹出后的大小:" << endl;cout << "s1 当前大小: " << s1.size() << endl;cout << "s2 当前大小: " << s2.size() << endl;return 0;
}

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

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

相关文章

【Web】初识Web和Tomcat服务器

目录 前言 一、认识web 1. 软件架构模式 2. web资源 3. URL请求路径&#xff08;统一资源定位符&#xff09; 二、Tomcat服务器 1. 简介 2. tomcat服务器的目录结构 3.使用tomcat服务器启动失败的常见原因 3.1 端口冲突 3.2 jdk环境变量配置出错 三、使用Tomcat发布…

重塑教育未来:数字教学与智能知识库的深度融合

在当今这个信息爆炸的时代&#xff0c;教育作为推动社会进步与发展的重要基石&#xff0c;正经历着前所未有的变革。随着科技的飞速发展&#xff0c;数字教学与智能知识库作为两大核心驱动力&#xff0c;正携手并进&#xff0c;共同塑造着教育的全新面貌。本文旨在探讨数字教学…

【Docker】Docker快速入门

Docker学习笔记 一、Docker概述 为什么会出现Docker? 安卓开发流程&#xff1a;apk(java开发的)发布到应用商店&#xff0c;用户安装apk即可使用。 后端开发流程&#xff1a; jar(java开发的)带上环境发布到Docker仓库&#xff0c;用户从Docker仓库拉取镜像并部署。 总结…

Java_Day05学习

Object类被子类经常重写的方法 方法说明toString()返回当前对象本身的有关信息&#xff0c;按字符串对象返回equals()比较两个对象是否是同一个对象&#xff0c;是则返回****truehashCode()返回该对象的哈希代码值getClass()获取当前对象所属的类信息&#xff0c;返回Class对象…

TAPD多类别需求管理

本文档将介绍&#xff1a;什么是 TAPD 多类别需求管理&#xff0c;以及如何配置或创建新的需求类别。 一、概述 在研发管理过程中&#xff0c;团队经常会遇到规模扩张、不同特性团队间研发模式差异化大等问题。以上问题导致团队中的需求无法进行统一管理。为解决上述情况&…

《关键跃升读书笔记》11

协作&#xff1a; 怎么解决“容忍⿊”这类问题&#xff1f;我们要重新理解“⽂化”。⼈类⽂化、企 业⽂化&#xff0c;都是为了让⼈们更好地协作。 再⼩的公司&#xff0c;再⼩的团队&#xff0c;都是⼀个共同协作体&#xff0c;就像整个⼈类社会 是共同协作体。理解了⼈类社会…

卷积的理解和应用

妈妈说&#xff0c;生活就像一盒各种口味的巧克力&#xff0c;你永远不知道下一块是什么。 我说生活像这个棒棒糖。不同口味&#xff0c;方向相反的味道一路走一路相伴&#xff0c;衰老和成长缠绕在一起&#xff0c;成了最终的滋味。 一、 卷积的直觉 这一生…

菱形继承的类对父类的初始化、组合、多态、多态的原理等的介绍

文章目录 前言一、菱形继承的类对父类的初始化二、组合三、 多态1. 构成多态2. 虚函数3. 虚函数的重写4. 虚函数重写的两个例外1. 协变2. 析构函数的重写 5. C11 final 和 override1. final2. override 6. 设计不想被继承的类7. 重载、覆盖&#xff08;重写&#xff09;、 隐藏…

YOLOv8——测量高速公路上汽车的速度

引言 在人工神经网络和计算机视觉领域&#xff0c;目标识别和跟踪是非常重要的技术&#xff0c;它们可以应用于无数的项目中&#xff0c;其中许多可能不是很明显&#xff0c;比如使用这些算法来测量距离或对象的速度。 测量汽车速度基本步骤如下&#xff1a; 视频采集&#x…

JVM的基本组成

一、JDK\JRE\JVM JDK: 全称 "Java Development Kit" &#xff0c;Java 开发工具包&#xff0c;提供 javac 编译器、jheap、jconsole 等监控工具;JRE: 全称"Java Runtime Environment"&#xff0c;Java 运行环境&#xff0c;提供Class Library 核心类库 JV…

同等学力英语用什么app背单词

同等学力申硕的意义和作用 授予同等学力人员硕士学位是国家为同等学力人员开辟的获得学位的渠道&#xff0c;对于在职人员业务素质的提高和干部队伍建设起到积极作用。它为那些没有传统学历背景但具有相应学术水平的人员提供了获取学位的机会&#xff0c;有助于提升他们的职业竞…

WebSocket实现在线聊天室

项目实现源码&#xff1a; 前端源码 后端源码 1.常见的消息推送方式 1.1 轮询 1.1.1 轮询的概念 客户端以固定的事件间隔&#xff08;例如每秒或几分钟&#xff09;向服务器发送HTTP请求&#xff0c;服务器收到请求后&#xff0c;处理请求并返回数据给客户端 轮询具体实现htt…

POI获取模板文件,替换数据横纵动态表格、折线图、饼状图、折线饼状组合图

先说几个关键的点 pom.xml依赖 <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version> </dependency> <dependency><groupId>com.deepoove</groupId>&…

鸭脖变“刺客”,啃不起了

撰文&#xff5c;ANGELICA 编辑&#xff5c;ANGELICA 审核&#xff5c;烨 Lydia 声明&#xff5c;图片来源网络。日晞研究所原创文章&#xff0c;如需转载请留言申请开白。 你有多久没吃卤味了&#xff1f; 2020年之后&#xff0c;人们对于几大卤味巨头的关注度正在下降。 …

【MySQL 04】数据类型

目录 1.数据类型分类 2.数值类型 2.1 tinyint 类型 2.2 bit类型 2.3 float类型 2.4decimal 3.字符串类型 3.1 char类型 3.2 varchar类型 4.日期和时间类型 6. enum和set类型 6.1.enum和set类型简介&#xff1a; 6.2.enum和set的一般使用方法 6.3.用数字的方式…

业务数据批量插入数据库实践

业务数据如何存储一直以来都是项目开发中的一个比较重要的话题。我们要从资源的利用率&#xff0c;业务场景和技术实现多个方面考虑存储的问题。“抛开业务谈技术就是耍流氓”&#xff0c;所有技术架构都要站在实际的业务场景中分析。比如个人端的产品&#xff0c;这种就属于读…

fiddler抓包11_列表显示服务器IP (配置文件)

请求列表默认不显示服务器IP字段&#xff0c;也无法从定制列窗口添加&#xff0c;可以修改CustomRules.js实现。 ① 菜单栏“Rules”&#xff08;规则&#xff09; - “Customize Rules...”&#xff08;自定义规则&#xff09;&#xff0c;打开CustomRules.js文件。 &#xf…

基于stm32的跑步机控制系统设计-设计说明书

设计摘要&#xff1a; 随着人们对健康和健身的关注增加&#xff0c;跑步机逐渐成为室内健身的主要设备之一。本文提出了一种基于STM32的跑步机控制系统设计&#xff0c;旨在实现对跑步机的运行速度、倾斜角度和运动模式等参数的精确控制&#xff0c;提供更好的健身体验。 首先…

vue3开发中易遗漏的常见知识点

文章目录 组件样式的特性Scoped CSS之局部样式的泄露Scoped CSS之深度选择器CSS Modules在CSS中使用v-bind 非props属性继承组件通信父子组件的相互通信props/$emit父组件传递数据给子组件子组件传递数据给父组件 非父子组件的相互通信Provide/inject全局事件总线 组件插槽作用…