• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

XiaoXiaoli

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

数据结构(西北大学)_串

串的基本概念

字符串是一个线性表,一个特定的线性表,其特定在组成线性表的每一个元素就是一个单字符。字符串在编程过程中使用次数非常频繁。

字符串概念:字符串(英语:string),是由零个或多个字符组成的有限序列。一般记为 s=“a1a2···an”(n>=0)。

概念解释:字符串组成的线性表的一般形式为,'a1a2···an'。每一个ai都属于一个字符集合,ai∈V字符集,其中的每一个ai就是一个字符。

 s=“a1a2···an”,这里我们说s为串名也就是标识符,引号中的为串值。这里我们应用的方式,可以使用表达式方式出现,也可以使用值的方式出现。

关于串的长度,“a1a2···an”,这里n就是线性表的表长度也就是字符串的长度(字符的个数)。

关于空串和空格串。空串,“”,引号中没有任何东西,长度为0。空格串,"   ",长度大于0,引号中的元素为空格。空串和空格之间的区别就是组成线性表的长度是0还是大于0。

我们给出子串的概念。子串是串的一部分。

子串的概念,串中任意个连续的字符组成的子序列称为该串的子串。如String这个字符串,Str、tr、Strin是一个子串。

字串在主串中的位置。如String,Str是一个子串,那么我们怎么表示子串呢?

(String,起始位置,终结位置)这是一种表示子串的方法。

(String,起始位置,长度0)这是一种表示子串方法。

左取(String,长度),右取(String,长度),所谓左取右取就是将起始位置规定了,只需要知道长度就可以表示子串。

串相等:当且仅当串的长度相等,并且对应位置的字符都相等串才算相等。

串的存储实现

表达字符串时我们告诉串的名字,串的位置,串的区间。 

有一个串名的存储区,将其和串值的存储区关联起来。串值存储的区域可以使用定长顺序串(长度固定,顺序存储方式),也可以用链表(链式结构)。

定长顺序串
#define
MAXLEN 20
typedef struct{
  char ch[MAXLEN]; 字符数组,字符组成的数组。数组中有开辟的长度。将串值放入到字符数组中。
  int len; 指示器,表示串的长度。
}SString

整体表示顺序串的结构类型。

定长顺序串基本操作的实现(顺序串一定有长度的限制,事先开辟的长度用来存储字符)

1串插入函数、2串删除函数、3串复制函数、4判空函数、5串比较函数、6求串长函数、7清空函数、8连接函数、9求子串函数、10定位函数。

串插入函数,在进行串的插入时,插入位置pos将串分为两个部分(假设A,B,长度为LA、LB)及待插入部分(假设为C,长度为LC),则串由插入前的AB变为ACB,可能有三种情况:

1.插入后串长(LA+LC+LB)<= MAXLEN 则将B后移LC个元素位置,再将C插入。这种情况是理想的,所有字符能放入事先开辟的空间。

2.插入后串长>MAXLEN且pos+LC<MAXLEN 则B后移时有部分字符被舍弃。这种情况是需要舍弃B。

3.插入后串长>MAXLEN且pos+LC>MAXLEN 则B的全部字符被舍弃(不需要后移),并且C在插入时也有部分字符被舍弃。这种情况C和B都需要进行舍弃。

int insert_string() {
    SString* s, t; /*s,主串。t,要插入串*/
    int pos; /*插入字符的位置*/
    int i;
    /*插入位置不合法*/
    if (pos < 0 || pos > s->len) {
        return 0;
    }
    /*全能放的下*/
    if (s->len + t.len <= LENMAX) { /*插入后串长<=LENMAX*/
        /*将B后移*/
        for (i = s->len + t.len - 1; i >= t.len + pos; i--) {
            s->str[i] = s->str[i - t.len];
        }

        for (i = 0; i < t.len; i++) {
            s->str[i + pos] = t.str[i];
        }
        s->len = s->len + t.len;

    }
    /*能放下c,但是b要舍弃部分*/
    else if (pos + t.len >= LENMAX) { /*插入后串长>LENMAX,但是串t的字符序列可以全部插入*/
        for (i = LENMAX - 1; i > t.len + pos - 1; i--) {
            s->str[i] = s->str[i - t.len];
        }
        for (i = 0; i < t.len; i++) {
            s->str[i + pos] = t.str[i];
            s->len = LENMAX;
        }
    }
    /*c要舍弃,b也要舍弃*/
    else { /*串t的部分字符序列要舍弃*/
        for (i = 0; i < LENMAX - pos; i++) {
            s->str[i + pos] = t.str[i];
        }
        s->len = LENMAX;
    }

    return 1;
}

 

posted on 2020-12-24 23:04  XiaoXiaoli  阅读(177)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3