分享

利用C#实现串结构

 老马的程序人生 2020-08-17

我们古人没有电影电视,没有游戏网络,所以文人们就会想出一些文字游戏来娱乐。比如宋代的李禺写了这样一首诗:“枯眼望遥山隔水,往来曾见几心知?壶空怕酌一杯酒,笔下难成和韵诗。途路阻人离别久,讯音无雁寄回迟。孤灯守夜长寥寂,夫忆妻兮父忆儿。”显然这是老公想念老婆和儿子的诗句。曾经和妻儿在一起,享受天伦之乐,现在一个人长久没有回家,也不见书信返回,望着油灯想念亲人,能不伤感吗?

可仔细一读发现,这首诗竟然可以倒过来读:“儿忆父兮妻忆夫,寂寥长夜守灯孤。迟回寄雁无音讯,久别离人阻路途。诗韵和成难下笔,酒杯一酌怕空壶。知心几见曾来往,水隔山遥望眼枯。”这表达了妻子对丈夫的思念。老公离开好久,路途遥远,难以相见。写信不知道写什么,独自喝酒也没什么兴致。只能和儿子夜夜守在家里一盏孤灯下,苦等老公的归来。

这种诗叫做回文诗。它是一种可以倒读或反复回旋阅读的诗体。刚才这首就是正读是丈夫思念妻子,倒读是妻子思念丈夫的古诗。是不是感觉很奇妙呢?

在英文单词中,同样有神奇的地方。“即使是lover也有个over,即使是friend也有个end,即使是believe也有个lie。”你会发现,本来不相干,甚至对立的两个词,却有某种神奇的联系。这可能是创造这几个单词的智者们也没有想到的问题。

今天我们就要来谈谈这些单词或句子组成字符串的相关问题。

1 串的定义与操作

1.1 串的相关定义

串(string)是由零个或多个字符组成的有限序列,又名字符串,记为S=”a0a1……an-1”。

串中包含字符的个数称为串的长度

长度为零的串称为空串(null string)。直接用双引号””表示,在C#中也可用string.Empty来表示。

还有一些概念需要解释:

空白串:由一个或多个空格组成的串。

子串与主串:串中任意连续字符组成的子序列,称为该串的子串。相应的包含子串的串称为主串,即子串是主串的一部分。

子串在主串中的位置:子串在主串中第一次出现时,子串第一个字符在主串中的序号。

例如

A=“this is a string”;

B=“is”;

B在A中的位置为2。

串相等:长度相等且对应位字符相同。

1.2 串的操作

串的逻辑结构和线性表很相似,不同之处在于串针对的是字符集,也就是串中的元素都是字符。因此,对于串的基本操作与线性表是有很大差别的。线性表更关注的是单个元素的操作,比如查找一个元素,插入或删除一个元素,但串中更多的是关注它子串的应用问题,如查找子串位置,得到指定位置子串、替换子串等操作。

关于串的基本操作如下:

(1)获取串的长度

(2)获取或设置指定索引处的字符

(3)在指定位置插入子串

(4)在指定位置移除给定长度的子串

(5)在指定位置取子串

(6)当前串的拷贝

(7)串连接

(8)串的匹配

(9)串替换

(10)移除串两边的空格

(11)串填充

比如C#中,字符串操作就还有ToLower转小写、ToUpper转大写、IndexOf从左查找子串位置、LastIndexOf从右查找子串位置、Trim去除两边空格等比较方便的操作,它们其实就是前面这些基本操作的扩展函数。

1 串接口

代码见:LinearStruct.IString.cs

2 串的存储与实现

串的存储结构与线性表相同,分为两种:

顺序存储:char类型的数组。由于数组是定长的,就存在一个预定义的最大串长度,它规定在串值后面加一个不计入串长度的结束符,比如’\0’来表示串值的终结。

链式存储:SlinkList<char> (浪费存储空间)


2 顺序串类图

代码见:LinearStruct.SeqString.cs

3 举例:

using System;

using LinearStruct;

namespace ConsoleApplicationString

{

    classProgram

    {

        privatestatic voidMain(string[] args)

        {

            string S = "teacherand student all like tea.";

            IString str = new SeqString(S);

            Console.WriteLine("原字符串:{0}", str);

            IString str2 = str;

            IString str3 = str.Clone();

            str2[0] = 'm';

            Console.WriteLine("没调用Clone方法:{0}", str);

            Console.WriteLine("调用Clone方法:{0}", str3);

            Console.WriteLine("----------");

            str = new SeqString(S);

            IString str4 = newSeqString("mother");

            Console.WriteLine(str.Insert(0, str4));

            Console.WriteLine(str.Insert(3, str4));

            Console.WriteLine(str.Remove(3, 2));

            Console.WriteLine(str.Remove(3, 10));

            Console.WriteLine("----------");

            Console.WriteLine(str.Concat(str4));

            Console.WriteLine((SeqString)str4 + (SeqString) str);

            Console.WriteLine("----------");

            Console.WriteLine(str.SubString(3, 0));

            Console.WriteLine(str.SubString(3, 4));

            Console.WriteLine(str.SubString(3, 10));

            Console.WriteLine("----------");

            IString parS1 = newSeqString("ea");

            IString parS2 = newSeqString("hk");

            Console.WriteLine(str.IndexOf(parS1));

            Console.WriteLine(str.IndexOf(parS1, 8));

            Console.WriteLine(str.IndexOf(parS2));

            Console.WriteLine("----------");

            Console.WriteLine(str.PadLeft(40, '@'));

            Console.WriteLine("----------");

            Console.WriteLine(str.Replace(new SeqString("ea"), newSeqString("EA")));

            Console.WriteLine("----------");

            Console.WriteLine(str.Concat(str4).Length);

            Console.WriteLine(str.Concat(str4).Trim().Length);

        }

    }

}


通过微信学习的知识只能是碎片化的知识,作为新时代的我们希望能够构建自己的知识结构,使我们的知识体系化,系统化,以后在遇到碎片化的知识,我们做的只是融合到自己的知识结构中,故我们将推出“与LSGO一起学”系列课程,帮助大家来构建知识框架,初步规划有:

  1. “与LSGO一起学C++”;

  2. “与LSGO一起学C#”;

  3. LSGO一起学Matlab”;

  4. “与LSGO一起学数据结构”;

  5. “与LSGO一起学设计模式”;

  6. “与LSGO一起学可视化建模语言(UML)”;

  7. “与LSGO一起学线性代数”;

  8. “与LSGO一起学高等数学”

  9. “与LSGO一起学概率论与数理统计”;

  10. “与LSGO一起学抽象代数;

  11. “与LSGO一起学点集拓扑”

  12. “与LSGO一起学数字图像处理”;

  13. “与LSGO一起学智能计算”;

如果对这些内容感兴趣,可以一起来学习讨论。

我们的官网: www.lsgogroup.com

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多