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;
}
相关推荐
千码君201616 分钟前
Go语言:解决 “package xxx is not in std”的思路
开发语言·后端·golang
Ypuyu21 分钟前
【GoLang】【框架学习】【GORM】4. 使用 BeforeUpdate hook 操作时,出现反射报错
开发语言·学习·golang
ZIM学编程1 小时前
「学长有话说」作为一个大三学长,我想对大一计算机专业学生说这些!
java·c语言·数据结构·c++·python·学习·php
maizeman1261 小时前
用R语言生成指定品种与对照的一元回归直线(含置信区间)
开发语言·回归·r语言·置信区间·品种测试
代码AC不AC1 小时前
【C++】哈希表封装实现 unordered_map 和 unordered_set
c++·unordered_map·unordered_set·哈希表封装
脚踏实地的大梦想家1 小时前
【Go】P17 Go语言并发编程核心:深入理解 Goroutine (从入门到实战)
java·开发语言·golang
贝塔实验室1 小时前
LDPC 码的构造方法
算法·fpga开发·硬件工程·动态规划·信息与通信·信号处理·基带工程
初学小白...1 小时前
线程同步机制及三大不安全案例
java·开发语言·jvm
Greedy Alg1 小时前
LeetCode 287. 寻找重复数
算法
2501_938791222 小时前
逻辑回归与KNN在低维与高维数据上的分类性能差异研究
算法·分类·逻辑回归