第2章第3节 串

关于串的基本定义已经在第2章栈和队列以及串中介绍过了,与栈和队列类似,同样存在顺序结构存储的串(这里简称顺序串)和链式结构存储的串(这里简称链串)。

一.顺序串

1.1定义

串的顺序实现是指分配一块连续的存储单元用于串中的元素,并附设表示串长度的标志。
串的顺序结构存储可以描述为:

typedef char ElemType;
typedef struct{
    ElemType data[MaxSize];
    int length;
}String;

1.2基本操作

1.2.1创建串

输入字符元素,以“#”号作为结束标志。

void StrCreat(String* S){
    char x;
    S->length=0;
    printf("Input String_S(End of '#'!):\n");
    scanf("%c",&x);
    while(x!='#'){
        S->data[S->length++]=x;
        scanf("%c",&x);
    }
}

1.2.2求串长度

因为串的定义中有length变量,只需返回结果便可。

int StrLength(String* S){
    return S->length;
}

1.2.3拷贝字符串

将字符串S拷贝到字符串T中,对字符串依次访问,同时赋值于字符串T即可完成拷贝。

void StrCopy(String* S, String* T){
    for(int i=0;i<S->length;i++){
        T->data[i]=S->data[i];
    }
    T->length=S->length;
}

1.2.4比较字符串大小

字符串大小比较实际是比较ASCII码大小,从左向右依次比较,如果此时哪个字符串的ASCII码值比较大,则返回结果;如果两个字符串长度不相等,但前面若干个字符均相等,则长度大的字符串比较大。

int StrCompare(String* S,String* T){
    int i=0;
    while(i!=S->length&&i!=T->length){
        if(S->data[i]<T->data[i]){
            return -1;
        }else if(S->data[i]>T->data[i]){
            return 1;
        }else{
            i++;
        }
    }
    if(i<S->length){
        return 1;
    }else if(i<T->length){
        return -1;
    }else{
        return 0;
    }

}

1.2.5连接字符串

将字符串T连接在字符串S后,注意此时S的长度以便,注意修改length变量。

void StrConcat(String* S, String* T){
    int i=S->length;
    for(i=i+1;i<S->length+T->length;i++){
        S->data[i]=T->data[i-S->length];
    }
    S->length=i;
}

1.2.6以串S中pos位置开始的len个字符生成子串Sub

因为采用的是顺序存储结构,可以使用函数随机访问,直接找到pos位置,然后将其后len个字符串均赋值给新的子串T便可。

String* SubString(String*S,int pos,int len){
    String *T;
    T=(String*)malloc(sizeof(String));
    T->length=0;
    if(pos>S->length||(pos+len)>S->length){
        printf("Illege Position!\n");
        exit(0);
    }
    for(int i=pos;i<pos+len;i++){
        T->data[T->length++]=S->data[i];
    }
    return T;
}

二.链串

2.1定义

采用链式存储的串称为链串。一般采用不带头结点的单链表实现。
链串的数据结构描述如下:

typedef struct SNode
{    ElemType data;
     struct SNode *next;
}String;

因为采用链式存储时的串与第1章的单链表操作类似,这里便不再详细说明。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好,我是ChitGPT。关于您的问题,可以使用Python的字符分割功能来实现。您可以使用Split方法将字符按照某个特定字符进行分割。比如,您可以输入以下代码实现您的需求: ``` str = "周一第3,4" str_list = str.split("第") print(str_list[0]) print(str_list[1]) ``` 这段代码会将字符按照“第”字符进行分割,并将结果存储在一个list。list的第一个元素是周一,第二个元素是3,4。顺便提醒一句,如果您需要保存3和4作为数字,可以使用Split方法后再进行类型转换,比如将它们转换成int类型。 希望这个答案对您有所帮助。如果有其他问题,可以随时问我哦! ### 回答2: 要将字符分割为"周一"和"3,4",可以使用字符的分割函数。具体步骤如下: 首先,定义一个字符变量"str",赋值为需要分割的字符。假设为"周一第3,4"。 其次,找到字符的关键字符,即"第"和","。通过这两个关键字符,可以将字符分割为三部分。 使用字符函数的split()方法,将字符进行分割。split()方法的参数为分割的关键字符。在这里,可以使用"第"和","作为参数。代码如下: parts = str.split("第") parts = parts[1].split(",") 这样就将原字符分割为两部分,分别为"周一"和"3,4"。 最后,输出分割完的两个部分。代码如下: print(parts[0]) print(parts[1]) 这样就可以分别输出"周一"和"3,4"。 需要注意的是,以上步骤是基于给定的字符格式进行分割。如果字符格式有所变动,可能需要调整代码的参数和逻辑。 ### 回答3: 要将字符"周一第3,4"分割为"周一"和"3,4"可以使用字符的切片方法或者正则表达式。 方法一:使用切片方法 首先,可以观察到"周一"和"3,4"之间存在一个"第"字,可以用这个作为分割点。我们可以找到"第"字在字符的索引位置,然后分别出这个索引位置前和后的部分。 代码如下: ```python s = "周一第3,4" index = s.index("第") # 找到"第"字的索引位置 part1 = s[:index] # 出索引位置前的部分(即"周一") part2 = s[index+1:] # 出索引位置后的部分(即"3,4") print(part1) # 输出"周一" print(part2) # 输出"3,4" ``` 方法二:使用正则表达式 如果字符的格式可能会有变化,不仅仅是"周一第3,4"这种形式,还有其他可能的形式,如"周二第1,2"。此时使用正则表达式可以更灵活地匹配出需要的部分。 代码如下: ```python import re s = "周一第3,4" pattern = r"(.+?)第(.+?)" # 正则表达式模式 match = re.match(pattern, s) # 进行匹配 part1 = match.group(1) # 出第一个括号的部分(即"周一") part2 = match.group(2) # 出第二个括号的部分(即"3,4") print(part1) # 输出"周一" print(part2) # 输出"3,4" ``` 以上两种方法都可以将字符"周一第3,4"分割为"周一"和"3,4",具体使用哪种方法可以根据实际情况灵活选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值