本文就介绍了数据结构中串的基本操作的编程实现,掌握串的建立、遍历,求子串,定位等基本操作
提示:以下是本篇文章正文内容,下面案例可供参考
有更简洁的代码实现,请移步链接: 数据结构——串的基本操作(C语言,究极简单,完整实现).
在计算机程序设计中,字符串 string 通常是字符序列,要么是文字常量,要么是某种变量。后者可能允许其元素发生突变,长度改变,或者是固定的(在创建之后)。字符串通常被认为是一种数据类型,通常作为字节(或字)的数组数据结构来实现,它存储了一系列元素,通常是使用一些字符编码的字符。字符串还可以用来表示更一般的数组或其他序列(或列表)数据类型和结构。
根据所使用的编程语言和精确的数据类型,声明为字符串的变量可能会导致内存中的存储被静态地分配给预先确定的最大长度,或者可以使用动态分配来容纳可变数量的元素。
当一个字符串在源代码中出现时,它被称为字符串文字或匿名字符串。
在数学逻辑和理论计算机科学中使用的正式语言中,string 是由一个叫做字母表的集合所选择的有限的符号序列。
串的实现形式有两种,堆分配和块链存储,本文讲述块链存储
串 sting,一般又可以被称作字符串,是由0个或则多个字符组成的有限序列。一般我们用S = “a1 a2 a3…an” 来表示,其中S 是串的名字,双引号或则单引号作为串的定界符用来表示串的内容即串值,ai (0<= i <= n) 则代表串中的单个元素,n表示穿的个数即串中有几个字符,当n 为0时,该串被称为空串(null string),用双引号“”来表示,符号记为Ф。
注,空白串(blank string)和空串的区别,空白串是由一个或多个空格组成的串。
在JAVA中,String有着更深层次的理解,本文不做过多叙述
子串(subString):串中任意几个连续的字符组成的子序列即为该串的子串
主串:相应地,包含该子串的串称为主串
子串的位置(index):子串在主串中首次出现时,该子串的首字符对应在主串中的序号,即为子串在主串中的位置。
这里有一个很经典的例子用来辅助说明。例如,设A和B分别为 A=‘This is a string’ B=‘is’ 则B是A的子串,A为主串。B在A中出现了两次,其中首次出现所对应的主串位置是3。因此,称B在A中的位置为3。 特别地,空串是任意串的子串,任意串是其自身的子串。
连接 (concatenation):连接是一个重要的二进制操作。对于任意两个主串中的子串s和t,它们的连接根据放置s和t 的前后顺序来定符号序列。例如,子串s = love,t = hug,那么st 就是lovehug,ts 就是huglove。
前缀和后缀 prefixes and suffixes:字符串s 可以说是t 的前缀,如果存在一个字符串u 满足条件t =su。如果u 是非空的,那么可以说s 是t 的一个合适的前缀;相应地,串s 可以说t 的后缀如果存在一个串u 满足条件t=us。如果u 是非空的,s 可以说是t 的一个合适的后缀。前缀和后缀可以说是t 的子串。
旋转:串s = uv 可以被说成t 的旋转如果t = vu. 举个例子,当u = 00110, v = 01的时候,串0011001 是0100110 的旋转。
逆转:串的逆转就是具有相同符号单顺序相反的字符串。例如,如果s=abc(a、b和c是字母表中符号),那么s 的逆转就是cba。一个与自身相反的字符串(例如,s=madam,逆转还是madam)被称为回文 palindrome,它还包括空字符串和所有长度为1的字符串。
#include
#include
#include
#define CHUNKSIZE 80
typedef struct
{
char *ch;
int length;
}HString;
int StrAssign(HString &T,char *chars)//生成一个其值等于串常量chars的T
{
// if(T.ch) free(T.ch);
int i,n;char *c;
for(i=0,c=chars;*c;++i,++c);
if(!i)
{
T.ch=NULL;
T.length=0;
}
else
{
if(!(T.ch=(char *)malloc(i*sizeof(char))))
return -1;
for(n=0;n<=i-1;n++)
{
T.ch[n]=chars[n];
T.length=i;
}
}
return 1;
}
int SubString(HString &Sub,HString S,int pos,int len)//求子串
{
int n;
if(pos<0||pos>S.length||len<0||len>S.length-pos+1)
{
return 0;
}
// if(Sub.ch) free(Sub.ch);
if(!len)
{
Sub.ch=NULL;
Sub.length=0;
}
else
{
Sub.ch=(char *) malloc(len * sizeof(char));
for(int n=0;n<=len-1;n++)
{
Sub.ch[n]=S.ch[pos+n-1];
}
Sub.length=len;
}
return 1;
}
int StrCompare(HString S,HString T)//若S>T,则返回值>0; 若S=T,则返回值0;若S
{
for(int i=0;i<S.length&&i<T.length;i++)
{
if(S.ch[i]!=T.ch[i])
return S.ch[i]-T.ch[i];
else
return S.length-T.length;
}
}
int Index(HString S,HString T,int pos)
{
int i=pos,j=0;
while(i<S.length&&j<T.length)
{
if(S.ch[i]==T.ch[j])
{
++i;++j;
}
else
{
i=i-j+1;
j=0;
}
}
if(j>=T.length) return i-T.length;
else return 0;
}
int StrLength(HString T)//求串长
{
return T.length;
}
void StrPrint(HString T)
{
int i;
for(i=0;i<T.length;i++)
{
printf("%c",T.ch[i]);
}
}
void Show()
{
printf("请输入想选择的指令:\n");
printf("1.显示串\n");
printf("2.显示串长\n");
printf("3.两串做比较\n");
printf("4.求子串\n");
printf("5.定位\n");
printf("0.退出\n");
printf("-------------------\n");
}
int main()
{
int n;
Show();
scanf("%d",&n);
char s[15]="qwertasdfzxc";
HString S;
StrAssign(S,s);
char t[5]="asdf";
HString T;
StrAssign(T,t);
HString Sub;
while(n!=0)
{
switch(n)
{
case 1:
printf("第一个串为:%s\n",S.ch);
printf("第二个串为:%s\n",T.ch);break;
case 2: printf("第一条串长:%d\n",StrLength(S));
printf("第二条串长:%d\n",StrLength(T));break;
case 3: int n ;
n=StrCompare(S,T);
if(n!=0)
if(n>0)
printf("前面长\n");
else
printf("后面长\n");
else
printf("一样长\n");break;
case 4:printf("请输入你想取的位置及长度:\t");
int j,l;
scanf("%d %d",&j,&l);
SubString(Sub,S,j,l);
StrPrint(Sub);break;
case 5: int k;
printf("输入查询的位置:\n");
scanf("%d",&k);
int x=Index(S,T,k);
printf("定位到的位置为:%d",x);break;
}
printf("\n");
Show();
scanf("%d", &n);
}
return 0;
}