当前位置: 首页 > news >正文

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;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MES系统如何提升制造企业的运营效率和灵活性
  • 深入剖析链表反转:多语言实现与高级语法特性20240924
  • 软件测试面试题(6)——二面(游戏测试)
  • 怎么设置u盘不让别人拷贝?八个方法集锦,一分钟教会你!(最全攻略来了)
  • 计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-21
  • 2024年汉字小达人区级自由报名比赛正式开始,大家最关注的问题解答
  • JavaScript 操作 DOM元素CSS 样式的几种方法
  • 电销系统办理步骤,一共分为几个步骤
  • 加速AI数据应用,肯睿Cloudera推出六款全新机器学习项目加速器AMPs
  • 2024年 AI大模型我该买一张什么卡?
  • 面向对象程序设计原则
  • AI时代的程序员:如何保持和提升核心竞争力
  • 【Linux网络 —— 网络基础概念】
  • 【工具】语音朗读PDF的免费工具
  • 在IntelliJ IDEA中创建一个HTML项目
  • [PHP内核探索]PHP中的哈希表
  • 【译】JS基础算法脚本:字符串结尾
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • [NodeJS] 关于Buffer
  • 【Linux系统编程】快速查找errno错误码信息
  • 【面试系列】之二:关于js原型
  • Angularjs之国际化
  • const let
  • ES6系列(二)变量的解构赋值
  • gitlab-ci配置详解(一)
  • go append函数以及写入
  • happypack两次报错的问题
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Js基础知识(一) - 变量
  • miaov-React 最佳入门
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Redis 懒删除(lazy free)简史
  • Spark学习笔记之相关记录
  • Theano - 导数
  • ⭐ Unity + OpenCV 实现实时图像识别与叠加效果
  • 安卓应用性能调试和优化经验分享
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 面试遇到的一些题
  • 前端工程化(Gulp、Webpack)-webpack
  • 入门级的git使用指北
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 原生 js 实现移动端 Touch 滑动反弹
  • 云大使推广中的常见热门问题
  • 正则学习笔记
  • 整理一些计算机基础知识!
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​Java并发新构件之Exchanger
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (笔试题)分解质因式
  • (初研) Sentence-embedding fine-tune notebook
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (回溯) LeetCode 78. 子集
  • (四) Graphivz 颜色选择