数据结构-串(字符串)

2023-11-01

// my_string.h
#ifndef MY_STRING_H
#define MY_STRING_H

#include <iostream>

using namespace std;

const int MAXSIZE=100;

class MyString
{
public:
    MyString(const MyString& copy);
    MyString(const char *init);
    MyString();
    ~MyString()
    {
        delete[] m_pstr;
    }
    int Length() const
    {
        return m_ncurlen;
    }
    int Find(MyString part) const;
    char* GetBuffer() const;
public:
    MyString& operator()(int pos, int len);
    bool operator==(const MyString cmp_str) const;
    bool operator!=(const MyString cmp_str) const;
    bool operator<(const MyString cmp_str) const;
    bool operator>(const MyString cmp_str) const;
    bool operator!() const
    {
        return (m_ncurlen == 0);
    }
    MyString& operator=(const MyString &copy);
    MyString& operator+=(const MyString &add);
    char& operator[](int i);
    friend ostream& operator<<(ostream&, MyString&);
    friend istream& operator>>(istream&, MyString&);
private:
    void Next();
private:
    char *m_pstr;
    int m_ncurlen;
    int *m_pnext;
};

#endif // MY_STRING_H
// my_string.cpp
#include "my_string.h"
#include <cstring>
#include <iostream>

using std::cout;
using std::endl;

MyString::MyString()
{
    m_pstr = new char[MAXSIZE];
    if(!m_pstr)
    {
        cerr << "Allocation Error" << endl;
        exit(1);
    }
    this->m_ncurlen = 0;
    m_pstr[0] = '\0';
}

MyString::MyString(const char *init)
{
    m_pstr = new char[MAXSIZE+1];
    if(!m_pstr)
    {
        cerr << "Allocation Error" << endl;
        exit(1);
    }
    this->m_ncurlen = strlen(init);
    strcpy(m_pstr, init);
}

MyString::MyString(const MyString &copy)
{
    m_pstr = new char[MAXSIZE];
    if(!m_pstr)
    {
        cerr << "Allocation Error" << endl;
        exit(1);
    }
    this->m_ncurlen = copy.m_ncurlen;
    strcpy(m_pstr, copy.m_pstr);
}

int MyString::Find(MyString part) const
{
    int posP = 0, posT = 0;
    int lengthP = part.m_ncurlen, lengthT = this->m_ncurlen;

    part.Next();
    while(posP < lengthP && posT < lengthT)
    {
        if(part.m_pstr[posP] == this->m_pstr[posT])
        {
            posP++;
            posT++;
        }
        else
        {
            if(posP == 0)
            {
                posT++;
            }
            else
            {
                posP = part.m_pnext[posP-1];
            }
        }
    }

    delete[] part.m_pnext;
    if(posP < lengthP)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}

void MyString::Next()
{
    int length = this->m_ncurlen;
    this->m_pnext = new int[length];
    this->m_pnext[0] = 0;
    for(int i = 1; i < length; i++)
    {
        int j = this->m_pnext[i-1];
        while(*(this->m_pstr+1) != *(this->m_pstr+j) && j > 0)
        {
            j = this->m_pnext[j-1];
        }
        if(*(this->m_pstr+i) == *(this->m_pstr+j))
        {
            this->m_pnext[i] = j + 1;
        }
        else
        {
            this->m_pnext[i] = 0;
        }
    }
}

char *MyString::GetBuffer() const
{
    return this->m_pstr;
}

MyString& MyString::operator()(int pos, int len)
{
    MyString *temp = new MyString;
    if(pos < 0 || pos + len - 1 > MAXSIZE || len < 0)
    {
        temp->m_ncurlen = 0;
        temp->m_pstr[0] = '\0';
    }
    else
    {
        if(pos+len-1 >= m_ncurlen)
        {
            len = m_ncurlen - pos;
        }
        temp->m_ncurlen = len;
        for(int i = 0, j = pos; i < len; i++, j++)
        {
            temp->m_pstr[i] = m_pstr[j];
        }
        temp->m_pstr[len] = '\0';
    }
    return *temp;
}

bool MyString::operator==(const MyString cmp_str) const
{
    if(this->m_ncurlen != cmp_str.m_ncurlen)
    {
        return 0;
    }
    for(int i = 0; i < this->m_ncurlen; i++)
    {
        if(this->m_pstr[i] != cmp_str.m_pstr[i])
        {
            return 0;
        }
    }
    return 1;
}

bool MyString::operator!=(const MyString cmp_str) const
{
    if(*this == cmp_str)
    {
        return 0;
    }
    return 1;
}

bool MyString::operator<(const MyString cmp_str) const
{
    if(this->m_ncurlen != cmp_str.m_ncurlen)
    {
        return this->m_ncurlen < cmp_str.m_ncurlen;
    }
    for(int i = 0; i < this->m_ncurlen; i++)
    {
        if(this->m_pstr[i] != cmp_str.m_pstr[i])
        {
            return this->m_pnext[i] < cmp_str.m_pnext[i];
        }
    }
}

bool MyString::operator>(const MyString cmp_str) const
{
    if(*this < cmp_str || *this==cmp_str)
    {
        return 0;
    }
    return 1;
}

MyString& MyString::operator=(const MyString &copy)
{
    delete[] this->m_pstr;
    this->m_pstr = new char[copy.m_ncurlen];
    strcpy(this->m_pstr, copy.m_pstr);
    return (*this);
}

MyString& MyString::operator+=(const MyString &add)
{
    int length = this->m_ncurlen + add.m_ncurlen;
    int n = this->m_ncurlen;
    MyString temp(*this);
    delete[] this->m_pstr;
    this->m_pstr = new char[length+1];
    for(int i = 0; i < n; i++)
    {
        this->m_pstr[i] = temp[i];
    }
    for(int i = n; i < length; i++)
    {
        this->m_pstr[i] = add.m_pstr[i-n];
    }
    this->m_pstr[length] = '\0';
    return (*this);
}

char& MyString::operator[](int i)
{
    if(i<0 || i >= this->m_ncurlen)
    {
        cout << __FUNCTION__ << " error : out of boundary! " << endl;
        exit(1);
    }
    return this->m_pstr[i];
}

ostream& operator<<(ostream& os, MyString& str)
{
    os << str.m_pstr;
    return os;
}

istream& operator>>(istream& is, MyString& str)
{
    is >> str.m_pstr;
    return is;
}
// main.cpp
#include <iostream>
#include "my_string.h"

using namespace std;

int main(int argc, char *argv[])
{
    MyString test1("babc");
    MyString test2("abababcdefb");
    cout << test2.Find(test1) << endl;
    cout << test2(2, 3) << endl;
    if(test1 < test2)
    {
        cout << test1 << " < " << test2 << endl;
    }
    else
    {
        if(test1 == test2)
        {
            cout << test1 << " == " << test2 << endl;
        }
        else
        {
            if(test1 > test2)
            {
                cout << test1 << " > " << test2 << endl;
            }
        }
    }

    int length = test2.Length();
    for(int i = 0; i < length; i++)
    {
        cout << test2[i];
    }
    cout << endl;

    test1 += test2;
    cout << test1 << endl;

    test1 = test2;
    cout << test1 << endl;
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构-串(字符串) 的相关文章

随机推荐

  • 【华为OD机试真题 JAVA】连续出牌数量

    JS版 华为OD机试真题 JS 连续出牌数量 标题 连续出牌数量 时间限制 1秒 内存限制 262144K 语言限制 不限 有这么一款单人卡牌游戏 牌面由颜色和数字组成 颜色为红 黄 蓝 绿中的一种 数字为0 9中的一个 游戏开始时玩家从手
  • 第五章 神经网络

    5 1 神经元模型 神经网络是由具有适应性的简单单元组成的广泛并行互连的网络 它的组织能够模拟生物神经系统对真实世界物体所做出的交互反应 神经网络中最基本的成分是神经元模型 5 2感知机与多层网络 感知机由两层神经元组成 多层前馈神经网络
  • Zotero软件中复制文献进入不同文件夹和删除文献的方法

    两种方式 方式1 选中文献 拖动文献至目标文件夹 检索文献 只会出现一篇 按住ctrl 可以看到在两个文件夹中均可以访问这篇文献 经验证 在pdf中的标记 两种文件夹访问时显示是同步的 如果想从一个文件夹中去除该文件 选中 键盘点击dele
  • 微信小程序rich-text富文本 解决图片超出屏幕宽度

    问题 微信小程序rich text富文本 图片超出屏幕宽度 文本数据 更改前效果 解决办法 最终效果 文本数据 更改前效果 解决办法 使用正则将数据中的img标签定义class或者直接写样式 再js文件中将数据进行修改 data conte
  • 数论整理之欧几里得算法gcd

    辗转相除法 使用到的原理很聪明也很简单 假设用f x y 表示x y的最大公约数 取k x y b x y 则x ky b 如果一个数能够同时整除x和y 则必能同时整除b和y 而能够同时整除b和y的数也必能同时整除x和y 即x和y的公约数与
  • 软件需求说明书 概要设计说明书 项目开发计划 详细设计说明书 模版

    一 软件需求说明书 1引言2 1 1编写目的2 1 2背景2 1 3定义2 1 4参考资料2 2任务概述2 2 1目标2 2 2用户的特点3 2 3假定和约束3 3需求规定3 3 1对功能的规定3 3 2对性能的规定3 3 2 1精度3 3
  • 对 React 状态管理的理解及方案对比

    1 React 状态 通信 React 为什么需要状态管理 React 特点 专注 view 层 专注 view 层 的特点决定了它不是一个全能框架 相比 angular 这种全能框架 React 功能较简单 单一 UI render da
  • MongoDB学习笔记番外篇:JDBC方式操作MongoDB示例

    1 pom xml中依赖包设置 在项目中引入MongoDB JDBC 驱动mongo java driver X X X jar
  • 2.1-梯度下降

    文章目录 一 调整学习率 1 1 自适应学习率 Adaptive Learning Rates 1 2 Adagrad 二 随机梯度下降 Stochastic Gradient Descent 三 特征缩放 Feature Scaling
  • js如何获取上个月第一天和最后一天

    js如何获取上个月第一天和最后一天 var nowdays new Date var year nowdays getFullYear var month nowdays getMonth if month 0 month 12 year
  • 刷脸支付免费领取保险全额赔付保安全

    现在账户升级后 每位用户都可以免费领取保险 此前未投保的可获得100万保额 已付费投保的则可提额至500万 上支付宝搜 账户安全险 完成升级 即可领到保单 如果账户被盗 不管是手机丢失 还是密码泄露 都能全额赔付 原本由用户支付的保费将由支
  • 解析域名的IP地址

    linux和windows环境下 nslookup windows的powershell环境下 resolve DnsName
  • 怎么用excel管理固定资产

    在当今的数字时代 我们已经习惯了使用各种电子工具来提高我们的生产力 其中 Excel无疑是一个强大的工具 它不仅可以帮助我们处理数据 还可以用来进行复杂的计算和分析 然而 你可能不知道的是 Excel也可以用来管理固定资产 这是一种非常有效
  • 【大唐杯备考】——5G系统勘察设计(学习笔记)

    前言 本期介绍5G系统勘察设计 目录 1 概述 1 1 5G网络预规划 1 1 1 5G建网需求确认 1 1 2 4G现网评估 1 1 3 站点规模估算 1 1 4 5G仿真评估 1 2 5G工程执行 1 2 1 站点勘察 1 2 2 5G
  • 无刷电机换相-六步换向-两两导通与三三导通

    六步换向两两导通和三三导通的区别2 一 三三导通的不常用 之前检索六步换向的方式都为无刷电机如何换向 也未有文献提到三三导通方式 上午检索三三导通方式 文献也极少 其应用多为BLDCM高频链驱动器 查看原因 三三导通可以提高绕组利用率 但容
  • 自动驾驶之入门目录【转】

    从零开始做自动驾驶定位 一 开篇 知乎 从零开始做自动驾驶定位 二 数据集 知乎 从零开始做自动驾驶定位 三 软件框架 知乎 从零开始做自动驾驶定位 四 前端里程计之初试 知乎 从零开始做自动驾驶定位 五 前端里程计之代码优化 知乎 从零开
  • STL-----模拟实现一级空间配置器

    众所周知 STL中有六大组件 容器 容器适配器 仿函数 迭代器 算法 空间配置器 在之前的学习中前面五种我们都已经接触过了 但是在学习其他组件的过程中 我们会发现一个东西隐藏在了一切组件的背后 它就是空间配置器 以STL的实现角度而言 空间
  • SSL证书格式转换

    JKS转PFX格式 keytool importkeystore srckeystore D server jks destkeystore D server pfx srcstoretype JKS deststoretype PKCS1
  • 怎么安装elementUI完整步骤

    安装elementUI完整步骤 安装命令 vue add element 安装过程如图选择 按照步骤一步步来就成功啦 安装成功后会多一个文件夹 src plugins element js element js import Vue fro
  • 数据结构-串(字符串)

    my string h ifndef MY STRING H define MY STRING H include