首页 > 其他分享 >8、串的顺序存储

8、串的顺序存储

时间:2024-09-27 08:49:48浏览次数:1  
标签:int strlength pos len StackString ++ 顺序存储

1、代码实现

#include<stdio.h>
#include<malloc.h>
#include<assert.h>
#include<string.h>
//"abcdef" => "abcdef/0
// 用数组第一个空间存储字符串长度  5 a b c e f  
#define MAX_STR_LEN 20
#define u_char unsigned char

//串结构顺序存储定义 
typedef u_char StackString[MAX_STR_LEN + 1];//多一个存储'\0'

//初始化 
void initString(StackString S){
    S[0] = '\0';
}

//赋值 
void strAssign(StackString S,char *str){
    int len = strlen(str);
    int i = 0;
    for(i;i < len;i++){
        S[i] = str[i];
    }
    S[len] = '\0';
}

//拷贝
void strCopy(StackString S,StackString T){
    int len = strlength(T);
    int i = 0;
    for(i;i < len;i++){
        S[i] = T[i];
    }
    S[len] = '\0';
}

//长度
int strlength(StackString S) {
    int len = 0;
    while(*S != '\0'){
        len++;
        S++;
    }
    return len;
}

//判空
int StrEmpty(StackString S) {
    return S[0] == '\0';
}

//比较[S > T => 1 ; S == T => 0 ; S < T => -1] 
int StrCompare(StackString S,StackString T){
    int result = 0;
    while(*S != '\0' || *T != '\0'){
        result = *S - *T;
        if(result != 0)
            break;
        S++;
        T++;
    }
    
    if(result > 0)
        result = 1;
     else if(result < 0)
        result = -1;
        
    return result;
}

//连接 串s1 和 串s2 并赋值给 Y
void StrConcat(StackString Y,StackString s1,StackString s2) {
    int len1 = strlength(s1);
    int len2 = strlength(s2);
    
    if(len1 + len2 <= MAX_STR_LEN){
        //如果两个串长度相加不超过最大长度 
        //两个都可以拷贝进去 
        int i = 0;
        int j = 0;
        for(i;i < len1;i++){
            Y[i] = s1[i];
        } 
        for(j;j < len2;j++){
            Y[i + j] = s2[j];
        }
        Y[len1 + len2] = '\0';
    }else if(len1 < MAX_STR_LEN){
        //s1都拷贝,s2部分拷贝
        int i = 0;
        int j = 0;
        for(i;i < len1;i++){
            Y[i] = s1[i];
        }
        for(j;j < MAX_STR_LEN - len1;j++){
            Y[i + j] = s2[j];
        }
        Y[MAX_STR_LEN] = '\0';
    } else{
        //只能拷贝s1
        int i = 0; 
        for(i;i < MAX_STR_LEN;i++){
            Y[i] = s1[i];
        }
        Y[MAX_STR_LEN] = '\0'; 
    }
} 

//从S的 pos开始剪切len长度 的子串给sub 
void SubString(StackString S,StackString sub,int pos,int len){
    int s_len = strlength(sub);
    if(pos < 0 || pos >= len || len < 0 || len > s_len)
        return;
    int i = 0;
    for(i;i < len;i++){
        sub[i] = S[pos + i];
    }
    sub[len] = '\0';
}

void StrInsert(StackString S,int pos,StackString T){
    int s_len = strlength(S);
    int t_len = strlength(T);
    
    if(s_len + t_len <= MAX_STR_LEN){
        int i = s_len - 1;
        //先把S的pos位置之后的元素挪动到后面 
        for(i;i >= pos;i--){
            S[i + t_len] = S[i];
        } 
        int j = pos;
        for(i = 0;i < t_len;i++){
            S[j + i] = T[i];
        }
        S[s_len + t_len] = '\0';
    } else if(s_len < MAX_STR_LEN){
        //只能拷贝T的部分
        int i = s_len - 1;
        //先把S的pos位置之后的元素挪动到后面 
        for(i;i >= pos;i--){
            S[i + t_len] = S[i];
        } 
        //不能完全拷贝T 只能拷贝T的部分
        t_len =  MAX_STR_LEN - s_len;
        int j = pos;
        for(i = 0;i < t_len;i++){
            S[j + i] = T[i];
        }
        S[s_len + t_len] = '\0';
    }
}

//在S串pos位置删除len长度字符
void strDelete(StackString S,int pos,int len) {
    int s_len = strlength(S); 
    int i = pos;
    for(i;i < s_len;i++){
        S[i] = S[i + len];
    }
    S[s_len - len] = '\0';
}

void strClear(StackString S){
    S[0] = '\0';
}
void printString(StackString S){
    printf("%s\n",S);
}

//模式匹配[注意:计算机中存储的是0 1,模式匹配算法在计算机中很有用]
int strIndex(StackString S,StackString T,int pos){
    int i = pos;
    int j = 0;
    while(S[i] != '\0' && T[j] != '\0'){
        if(S[i] == T[j]){
            i++;
            j++;
        } else {
            //i回到开始下标的下一个 
            i = i - j + 1;
            j = 0;
        }
    } 
    if(T[j] == '\0')
        return i - j;
    return -1;
}  

//把主串S中的 子串T 全部换成 子串V 
void strReplace(StackString S,StackString T,StackString V){
    int s_len = strlength(S);
    int t_len = strlength(T);
    int v_len = strlength(V);
    
    int index = -1;
    int pos = 0;
    while(pos < s_len){
        index = strIndex(S,T,pos);
        if(index == -1){
            return;
        }
        //先删除 
        strDelete(S,index,t_len);
        //在插入
        StrInsert(S,index,V);
        //更改下一次匹配的位置为 上一次匹配的位置 + 字串V的长度 
        pos = index + v_len;
    }

}
int main(){
    StackString S;// =>unsigned char[MAX_STR_LEN + 1]
    strAssign(S,"abqwqcdefqwqss");
    printString(S);
    
//    StackString sub;
//    strAssign(sub,"123");
//    StrInsert(S,2,sub);
//    printString(sub);

//    StackString T;
//    strAssign(T,"adaaa");
//    int i = strIndex(S,T,0);
//    printf("%d",i);
    
    StackString T;
    initString(T);
    strAssign(T,"qwq");
    
    StackString V;
    initString(V);
    strAssign(V,"ovo");
    strReplace(S,T,V);
    printString(S);

    return 0;
} 

 

标签:int,strlength,pos,len,StackString,++,顺序存储
From: https://www.cnblogs.com/xpp3/p/18434950

相关文章

  • 数据结构之二叉树的顺序存储结构与链式存储结构
    一、顺序存储结构1.定义与特点顺序存储结构是指用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素。完全二叉树和满二叉树采用顺序存储比较合适,因为它们的结点序号可以唯一地反映结点之间的逻辑关系,从而既能最大地节省存储空间,又能利用数组元......
  • 二叉树的顺序存储
    目录顺序存储:简介:节点的位置关系:优缺点:优点:缺点:二叉树顺序存储的模拟实现:向上调整算法:向下调整算法:二叉树的初始化:直接初始化:建堆初始化:二叉树的头删:二叉树的尾插:二叉树的取顶端元素:二叉树的判空:二叉树的销毁:完整代码:顺序存储:简介:顺序结构存储就是使......
  • 03-3.2.2 队列的顺序存储实现
    ......
  • 队列——顺序存储
    核心思路:1、使用顺序存储的方式定义队列时,使用数组存储队列元素,然后声明两个int类型的指针——rear和front,分别指向队尾元素的下一个位置和队头元素的位置。2、初始化队列时,队列的首尾指针都指向0。3、当队列为空时,队尾和队头指针指向同一个位置(不一定等于0)。4、队满条......
  • 栈1: 栈的顺序存储
    栈:顺序存储栈是一种先进后出(FirstInLastOut,FILO)的数据结构如果你将两个元素压入栈,先加入的元素将在后加入的元素之后出栈栈顶元素值为null(未满时)定义栈的数据结构#defineMAX_SIZE1024//利用数组模拟栈的顺序存储typedefstructsqStack{void*data[MA......
  • 数据结构之线性表(顺序存储表)
    php<?php/***CreatedbyPhpStorm.*User:SillyCat*Date:2024/3/2*Time:18:47*/classSequenceList{private$item=array();private$length=0;publicfunction__construct(){//$this->item=$item;......
  • 【数据结构】详谈队列的顺序存储及C语言实现
    循环队列及其基本操作的C语言实现前言大家好,很高兴又和大家见面啦!!!在上一篇内容中,我们在介绍完队列的基本概念、重要术语以及基本操作后,又回顾了一下数据结构的三要素——数据的逻辑结构、数据的存储结构以及数据的运算。队列这种数据结构我们已经介绍了它的逻辑结构以及数据运算......
  • 简单的顺序存储容器
    本文简述了一个实现了顺序存储的容器类(Array),并对其进行了验证。此Array类具有如下能力:支持泛型指定存储容量可用列表(initializer_list)初始化支持拷贝和移动语义可按值或引用传递此类的对象,也可作为值返回可用下标运算符访问元素支持基于范围的循环◆实现使用类模板......
  • 11.16线性表A,B顺序存储合并
     #include<iostream>#include<cstring>usingnamespacestd;typedefstructf{intdata;f*next;}node,*Node;voidbuild(f*p){intx;while(cin>>x&&x!=-1){f*now=newnode();now->data=x;......
  • 线性表A,B顺序存储合并
    7-1线性表A,B顺序存储合并有两张非递增有序的线性表A,B,采用顺序存储结构,两张表合并用c表存,要求C为非递减有序的,然后删除C表中值相同的多余元素。元素类型为整型#include<iostream>#include<cstring>usingnamespacestd;typedefstructf{intdata;f*next;}node,*......