My_string 运算符重载,My_stack

news2025/4/4 1:19:44

思维导图

在这里插入图片描述

将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]) {// 如果当前对象的字符大于传入对象的字符,则返回 true
                return true;
            } else if (this->ptr[i] < R.ptr[i]) { // 如果当前对象的字符小于传入对象的字符,则返回 false
                return false;
            }
            i++;
        }

        if (this->ptr[i] != '\0' && R.ptr[i] == '\0') {// 如果当前对象的字符串未结束,而传入对象的字符串已结束,返回 true
            return 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.coloradmin.cn/o/2162594.html

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

相关文章

【论文】FunAudioLLM:一个旨在增强人类与大型语言模型(LLMs)之间自然语音交互的模型家族

研究背景 1.研究问题&#xff1a;这篇文章要解决的问题是如何增强人类与大型语言模型&#xff08;LLMs&#xff09;之间的自然语音交互。具体来说&#xff0c;研究集中在语音识别、情感识别和音频事件检测&#xff08;多语言&#xff09;以及语音生成&#xff08;多语言、零样…

云栖3天,云原生+ AI 多场联动,新产品、新体验、新探索

云栖3天&#xff0c;云原生 AI 20场主题分享&#xff0c;三展互动&#xff0c;为开发者带来全新视听盛宴 2024.9.19-9.21 云栖大会 即将上演“云原生AI”的全球盛会 展现最新的云计算技术发展与 AI技术融合之下的 “新探索” 一起来云栖小镇 见证3天的云原生AI 前沿探索…

828华为云征文 | 在华为云上通过Docker容器部署Elasticsearch并进行性能评测

目录 前言 1. 华为云X实例介绍及优势 1.1 柔性算力 1.2 vCPU和内存的灵活配比 1.3 成本效益与性能 2. 安装并运行 Docker 2.1 修改仓库配置文件 2.2 安装 Docker 2.3 启动 Docker 3. 使用Docker部署Elasticsearch 3.1 拉取Elasticsearch镜像 3.2 启动Elasticsearch…

SpringBoot整合ELK实现日志监控(保姆级教程)

新建SpringBoot项目 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.…

[单master节点k8s部署]24.构建EFK日志收集平台(三)

Kibana Kibana是elasticsearch的可视化界面。 首先创建kibana的服务&#xff0c;yaml文件如下。k8s里的服务分为四种&#xff0c;clusterIP为仅仅为pod分配k8s集群内部的一个虚拟ip&#xff0c;用于集群内的pod通信&#xff0c;而不对外暴露。elasticsearch的服务就是cluster…

Redis 优化

目录 优雅的 key 删除 Bigkey 恰当的数据类型 批处理优化 Pipeline 集群下的批处理 服务端优化 持久化配置 慢查询 命令以及安全配置 内存安全和配置 内存缓冲区配置 集群最佳实践 集群带宽问题 集群还是主从 优雅的 key 删除 Bigkey Bigkey 内存占用较多&…

线程池和JUC

1. 线程池 1.1 线程状态介绍 当线程被创建并启动以后&#xff0c;它既不是一启动就进入了执行状态&#xff0c;也不是一直处于执行状态。线程对象在不同的时期有不同的状态。那么Java中的线程存在哪几种状态呢&#xff1f;Java中的线程 状态被定义在了java.lang.Thread.Stat…

微服务学习笔记之Docker

目录 认识Docker 安装Docker 安装yum工具 配置Docker的yum源 更新yum&#xff0c;建立缓存 安装Docker 启动并校验 配置镜像加速 Docker常见命令 命令 演示 给命令起别名 Docker数据卷 认识数据卷 数据卷常见命令 nginx的html目录挂载演示 数据卷挂载本地目录或…

强制类型转换

问题 最近在研读公司项目的时候发现一段很有意思的代码&#xff1a; if (a instanceof b) {B ent (B) a;if (!useGivenAuditAttributes) {ent.createdAt MyDateUtils.now();ent.createdBy AppContext.instance.loginUser.userId;ent.lastUpdatedAt ent.createdAt;ent.las…

如何把python(.py或.ipynb)文件打包成可运行的.exe文件?

将 Python 程序打包成可执行的 .exe 文件&#xff0c;通常使用工具如 PyInstaller。这是一个常用的 Python 打包工具&#xff0c;可以将 Python 程序打包成独立的可执行文件&#xff0c;即使没有安装 Python 也能运行。 步骤&#xff1a; 1. 安装 PyInstaller 使用 conda 安…

【shell脚本5】Shell脚本学习--条件控制

目录 条件判断&#xff1a;if语句 分支控制&#xff1a;case语句 条件判断&#xff1a;if语句 语法格式&#xff1a; if [ expression ] thenStatement(s) to be executed if expression is true fi 注意&#xff1a;expression 和方括号([ ])之间必须有空格&#xff0c;否…

centos7 配置 docker 国内镜像源

1.修改配置文件/etc/docker/daemon.json sudo vim /etc/docker/daemon.json2.增加或修改以下配置内容 {"registry-mirrors": ["https://dockerproxy.com","https://hub-mirror.c.163.com","https://mirror.baidubce.com","http…

谷歌浏览器如何更改下载文件存放的方式及其路径?

1、点击谷歌浏览器右上角的【三个点】 2、选择【设置】&#xff0c;再选择【下载内容】 3、打开【下载完成后显示下载内容】开关&#xff0c; 则&#xff1a;下载网页上的东西之后&#xff0c;会显示在【谷歌浏览器】的右侧&#xff0c;并显示具体下载文件在右侧&#xff1a;…

PR视频剪辑工具全指南:开启专业剪辑之旅

pr视频剪辑可以说是视频剪辑里的一把好手&#xff0c;就是如果你想在这方面深耕那还是掌握这个工具的使用比较方便。如果你只是刚入门&#xff0c;那也有不少可以快速帮你剪辑出片的工具。这次我介绍几款我用过的视频剪辑工具&#xff0c;助你开启视频剪辑大门。 1.福昕视频剪…

vue echarts tooltip动态绑定模板,并且处理vue事件绑定

先上代码&#xff1a; tooltip: {// 这里是车辆iconshow: true,// trigger: "item",// backgroundColor: "transparent",appendToBody: true,textStyle: {color: "#ffffff" //设置文字颜色},formatter: (params) > {const TruckTooltip Vue.…

Java-数据结构-排序(三) |ू・ω・` )

目录 ❄️一、归并排序&#xff1a; ☞ 基本思想&#xff1a; ☞ 代码&#xff1a; ☞ 归并排序的非递归方法&#xff1a; ❄️二、排序算法的分析&#xff1a; ❄️三、非基于比较的排序&#xff1a; ❄️总结&#xff1a; ❄️一、归并排序&#xff1a; ☞ 基本思想&#xf…

在一个.NET Core项目中使用RabbitMQ进行即时消息管理

为了在一个.NET Core项目中使用RabbitMQ进行即时消息管理&#xff0c;以下是详细的全程操作指南&#xff0c;包括安装、配置、编写代码和调试使用。 一、安装RabbitMQ 1. 安装Erlang RabbitMQ依赖Erlang&#xff0c;因此需要先安装Erlang。 Windows: 下载并运行Erlang安装…

人工智能-机器学习-深度学习-分类与算法梳理

目前人工智能的概念层出不穷&#xff0c;容易搞混&#xff0c;理清脉络&#xff0c;有益新知识入脑。 为便于梳理&#xff0c;本文只有提纲&#xff0c;且笔者准备仓促&#xff0c;敬请勘误&#xff0c;不甚感激。 请看右边目录索引 。 人工智能 三大派系 符号主义(Symbolists…

[附源码]宠物领养管理系统+SpringBoot

今天带来一款优秀的项目&#xff1a;宠物领养管理系统源码 。 系统采用的流行的前后端分离结构&#xff0c;内含功能包括"管理端"&#xff0c;“用户领养端”&#xff0c;“宠物管理”&#xff0c;“权限登录”等功能。 如果您有任何问题&#xff0c;也请联系小编&a…

keepalived+lvs集群

目录 一、环境 二、配置 1、master 1.在master上安装配置Keepalived 2.在master上修改配置文件 2、backup 1.在backup&#xff08;192.168.229.12&#xff09;上安装keepalived 2.在backup上修改配置文件 3、master和backup上启动服务 4、web服务器配置 1.web1和web…