My_string 运算符重载,My_stack

思维导图

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

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

My_string

my_string.h

cpp 复制代码
#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

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

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,实现一个栈的操作

Mystack

My_stack.cpp

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

cpp 复制代码
#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

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;
}
相关推荐
十年一梦实验室13 分钟前
【C++】sophus : sim_details.hpp 实现了矩阵函数 W、其导数,以及其逆 (十七)
开发语言·c++·线性代数·矩阵
taoyong00116 分钟前
代码随想录算法训练营第十一天-239.滑动窗口最大值
c++·算法
这是我5823 分钟前
C++打小怪游戏
c++·其他·游戏·visual studio·小怪·大型·怪物
fpcc30 分钟前
跟我学c++中级篇——C++中的缓存利用
c++·缓存
呆萌很1 小时前
C++ 集合 list 使用
c++
诚丞成2 小时前
计算世界之安生:C++继承的文水和智慧(上)
开发语言·c++
东风吹柳3 小时前
观察者模式(sigslot in C++)
c++·观察者模式·信号槽·sigslot
A懿轩A3 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
大胆飞猪4 小时前
C++9--前置++和后置++重载,const,日期类的实现(对前几篇知识点的应用)
c++
1 9 J4 小时前
数据结构 C/C++(实验五:图)
c语言·数据结构·c++·学习·算法