2024.9.24 作业

My_string类中的所有能重载的运算符全部进行重载+、[] 、>、=、>)

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

#include <iostream>
#include <cstring>

using namespace std;


class My_string{
private:
    char *ptr;
    int size;
    int len;

public:
    //无参构造
    My_string():size(15){
        this->ptr=new char[size];
        this->ptr[0]='\0';
        this->len=0;
    }
    //有参构造
    My_string(const char*src):len(0){
        len=strlen(src);
        this->size=this->len+1;
        this->ptr=new char[size];
        strcpy(ptr,src);
    }
    My_string(int num,char value):size(num+1),len(num){
        ptr=new char[size];
        for(int i=0;i<len;i++){
            ptr[i]=value;
        }
        ptr[len]='\0';
    }
    //拷贝构造
    My_string(const My_string&other){
        size=other.size;
        len=other.len;
        ptr=new char[other.size];
        strcpy(ptr,other.ptr);

    }
    //拷贝赋值
    My_string& operator=(const My_string&other){
        if(this==&other){
            return *this;
        }
        size=other.size;
        len=other.size;
        ptr=new char[other.size];
        strcpy(ptr,other.ptr);
    }

    //析构
    ~My_string(){
        delete[] ptr;
    }

    //判空
    bool isempty(){
        return len==0;
    }

    //尾插
    void push_back(char value){
       if(len+1>=size){
           size+=1;
           char *new_ptr=new char(size);
           strcpy(new_ptr,ptr);
           delete []ptr;
           ptr=new_ptr;
       }
       ptr[len++]=value;
       ptr[len]='\0';
    }

    //尾删
    void pop_back(){
        if(len>0){
        ptr[--len]='\0';
    }
    }

    //at
    char &at(int index){
        return ptr[index];
    }

    //清空
    void clear(){
        len=0;
        ptr[0]='\0';
    }

    //获取c风格字符串
    void *data(){
        return ptr;
    }

    //获取实际长度
    int get_length(){
        return len;
    }

    //获取最大容量
    int get_size(){
        return size;
    }

    //二倍扩充,注意new_ptr不需要delete回收是因为这个是栈空间,函数结束会自动回收。
    void double_capacity(){
        size*=2;
        char *new_ptr=new char[size];
        strcpy(new_ptr,ptr);
        delete []ptr;
        ptr=new_ptr;
    }

    My_string operator+(const My_string&other)const{
        My_string result;
        result.len=len+other.len;
        result.size=result.len+1;
        result.ptr=new char[result.size];
        strcpy(result.ptr,ptr);
        strcat(result.ptr,other.ptr);
        //虽然result在栈上的空间会自动释放,注意result的数组不是,需要析构函数手动删除
        return result;
    }

    My_string& operator+=(const My_string&other){
        len+=other.len;
        if(len+1>size){
            size=len+1;
            char *new_ptr=new char[size];
            strcpy(new_ptr,ptr);
            strcat(new_ptr,other.ptr);
            delete [] ptr;
            ptr=new_ptr;
        }else{
            strcat(ptr,other.ptr);
        }
        return *this;

    }

    My_string& operator+=(char value){
        push_back(value);
        return *this;
    }

    bool operator<(const My_string&other)const{
        return strcmp(ptr,other.ptr)<0;
    }
    bool operator>(const My_string&other)const{
        return strcmp(ptr,other.ptr)>0;
    }

    bool operator<=(const My_string&other)const{
        return strcmp(ptr,other.ptr)<=0;
    }
    bool operator>=(const My_string&other)const{
        return strcmp(ptr,other.ptr)>=0;
    }
    bool operator==(const My_string&other)const{
        return strcmp(ptr,other.ptr)==0;
    }
    friend ostream&operator<<(ostream&os,const My_string&str){
        os<<str.ptr;
        return os;
    }
    friend istream& operator>>(istream&is,My_string&str){
        char buffer[1024];
        is>>buffer;
        str=My_string(buffer);
        return is;
    }


};

class My_stack{
private:
    int* data;
    int capacity;
    int top;
public:
    My_stack(int size=10):capacity(size),top(-1){
        data=new int[size];
    }
    ~My_stack(){
        delete []data;
    }
    void double_size(){
        capacity=2;
        int *new_ptr=new int[capacity];
        for(int i=0;i<=top;i++){
            new_ptr[i]=data[i];
        }
        delete []data;
        data=new_ptr;
    }
    bool isempty(){
        return top==-1;
    }
    void push(const int&value){
        if(top+1>=capacity){
            double_size();
        }
        data[++top]=value;
    }

    void pop(){
        if(isempty())return;
        else --top;
    }
    int get_top(){
        return data[top];
    }
    void swap(int index1,int index2){
        int temp=data[index1];
        data[index1]=data[index2];
        data[index2]=temp;
    }
};

int main()
{
    My_string str1("Hello");
    My_string str2(" World");
    My_string str3 = str1 + str2;

    cout << "连接 " << str3 << endl;

    My_string str4;
    cout << "输入 ";
    cin >> str4;
    cout << "输入了" << str4 << endl;

    return 0;
}
相关推荐
Dola_Pan2 分钟前
C语言:数组转换指针的时机
c语言·开发语言·算法
ExiFengs2 分钟前
实际项目Java1.8流处理, Optional常见用法
java·开发语言·spring
paj1234567893 分钟前
JDK1.8新增特性
java·开发语言
IT古董11 分钟前
【人工智能】Python在机器学习与人工智能中的应用
开发语言·人工智能·python·机器学习
繁依Fanyi14 分钟前
简易安卓句分器实现
java·服务器·开发语言·算法·eclipse
烦躁的大鼻嘎31 分钟前
模拟算法实例讲解:从理论到实践的编程之旅
数据结构·c++·算法·leetcode
IU宝34 分钟前
C/C++内存管理
java·c语言·c++
湫ccc34 分钟前
《Python基础》之pip换国内镜像源
开发语言·python·pip
fhvyxyci35 分钟前
【C++之STL】摸清 string 的模拟实现(下)
开发语言·c++·string
qq_4597300338 分钟前
C 语言面向对象
c语言·开发语言