欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

大话数据结构 -- 串

程序员文章站 2022-06-14 22:13:49
...

最近有点浮躁,看东西看一会就看不进去,调bug几个小时才调好。。。要坚持啊,Maggie!!为了那个目标,为了理想。。平心静气,脚踏实地,加油。

//
//  main.cpp
//  串
//
//  Created by Maggie on 18/8/23.
//  Copyright © 2018年 Maggie. All rights reserved.
//

#include <iostream>
#define MAXSIZE 40
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0

using namespace std;

typedef char String[MAXSIZE+1]; //定义char[MAXSIZE+1] 为String(多的第一位存长度)

int StrAssign(String T, char *chars){    //初始化(将字符串变为String类型)
    if(strlen(chars)>MAXSIZE){
        return ERROR;
    }
    else{
        T[0]=strlen(chars);        //strlen函数求长度
        for(int i=1;i<=T[0];i++){
            T[i]=*(chars+i-1);        //指针
            
        }
        return OK;
    }
}

int StrCopy(String T,String S){    //复制S到T
    for(int i=0;i<=S[0];i++){
        T[i]=S[i];
    }
    return OK;
}

int ClearString(String S){    //置S为空串
    S[0]=0;
    return OK;
}

int StringEmpty(String S){    //判断S是否为空
    if(S[0]==0)
        return TRUE;
    else
        return FALSE;
}

int StrLength(String S){    //返回串S长度
    return S[0];
}

int StrCompare(String S, String T){    //比较两串
    for(int i=1;i<=S[0]&&i<=T[0];i++){	//注意i要同时小于S的长度和T的长度
        if(S[i]>T[i])
            return TRUE;
        else if(S[i]<T[i])
            return -1;
    }
    
    return S[0]-T[0];	//前面都相等,谁长度大谁就大
}

int Concat(String T,String S1, String S2){    //连接两串,结果保存在T中
    
    int i;
    for(i=1;i<=S1[0];i++)        // T的前1到S1[0]个字符为S1
        T[i]=S1[i];
    for(i=1;i<=S2[0];i++)    //T的S1[0]+1到S2[0]个字符为S2
        T[S1[0]+i]=S2[i];
    T[0]=S1[0]+S2[0];        //更新长度
    return OK;
}

int SubString(String Sub,String S,int pos,int len){    //从主串S的pos位置开始截取长度为len的子串保存在Sub中
    if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)    //如果截取开始位置不当(小于第一个字符或大于最后一个字符)或截取长度不当(小于0或大于最大所能截取长度(从pos开始截))则返回错误
        return ERROR;
    for(int i=1;i<=len;i++){
        Sub[i]=S[i+pos-1];    //返回的Sub下标从1开始,截取S的下标从pos开始
    }
    Sub[0]=len;    // 更新长度
    return OK;
}

int Index(String S, String T, int pos){    //在主串S中找到从pos开始与子串T相匹配的第一个字符的位置
    int i=pos;
    int j=1;
    while(i<=S[0]&&j<=T[0]){    // 注意i<=S[0]和j<=T[0]要同时满足
        if(S[i]==T[j]){    //匹配一致,则均后移继续匹配
            i++;
            j++;
        }
        else{        //匹配不一致,则主串下标置1,主串下标后移一位
            i=i-j+2;
            j=1;
        }
    }
    if(j>T[0])    //j>T[0]说明子串全部比较完且与主串中某一部分一致
        return i-T[0];	// 注意i才是主串的下标,i-T[0]返回开始匹配的位置
    else
        return 0;
}

int StrInsert(String S, int pos, String T){    //在主串S的pos位置前插入子串T
    String S1;
    SubString(S1,S,1,pos-1);
    Concat(S1,S1,T);            //连接前pos-1个字符和子串T为S1
    
    String S2;
    SubString(S2,S,pos,S[0]-pos+1);
    Concat(S,S1,S2);        //连接S1和后S[0]-pos+1个字符为S
    return OK;
}


int StrDelete(String S, int pos, int len){    //从主串S的pos位置开始删除len长度的子串
    String S1;
    String S2;
    if(pos>1){   
        SubString(S1,S,1,pos-1);
        SubString(S2,S,pos+len,S[0]-pos-len+1);
        Concat(S,S1,S2);
        return OK;
    }
    else{         //由于pos为1时,pos-1=0,SubString会返回一个空串
        SubString(S,S,pos+len,S[0]-pos-len+1);
        return OK;
    }
}

int Replace(String S, String T, String V){        //在主串S中用子串V替代出现的子串T
    int i=1;
    if(StringEmpty(T))        // 主串中无子串T
        return ERROR;
    do{
        i=Index(S,T,i);    //i为每个子串T的第一个字符的位置
        if(i){
            StrDelete(S,i,StrLength(T));    //删除每个子串T
            StrInsert(S,i,V);        //插入子串V
            i+=StrLength(V);    //i后移一个子串V的位置
        }
    }while(i);
    return OK;
}


void StrPrint(String T)          //打印
{ 
    int i;
    for(i=1;i<=T[0];i++)
        printf("%c",T[i]);
    printf("\n");
}



int main(void){
    //char s[10]={'1','2','3','4','5','6','7','8','9','0'};
    String T1;
    StrAssign(T1, "abcdefghij");
    StrPrint(T1);
    
    int len1=StrLength(T1);
    cout<<len1<<endl;
    
    String T2;
    StrCopy(T2,T1);
    StrPrint(T2);

    String T3;
    StrAssign(T3, "abcdefghj");
    int comp=StrCompare(T1,T3);
    cout<<comp<<endl;
    
    String T4;
    String T5;
    StrAssign(T4, "abc");
    StrAssign(T5, "xyz");
    Concat(T4, T4, T5);
    StrPrint(T4);
    
    String sub;
    SubString(sub, T1, 1, 5);
    StrPrint(sub);
    
    String T6;
    StrAssign(T6, "bc");
    int a=Index(T1, T6, 1);
    cout<<a<<endl;
    
    
    StrInsert(T1, 1, T6);
    StrPrint(T1);
    int len2=StrLength(T1);
    cout<<len2<<endl;

    StrDelete(T1, 2, 2);
    int len3=StrLength(T1);
    cout<<len3<<endl;
    StrPrint(T1);
    
    Replace(T1, T6, T5);
    StrPrint(T1);
    return 0;
}