second60 20180422
串,即字符串,是由零个或多个字符组成的有限序列。
空串:没有字符。
串长:字符的个数。
ADT String
{
数据对象:
D={ai | i<=i <= n,n>=0,ai char类型}
数据关系:
R={
基本运算:
StrAssign(&s, cstr): 赋值
StrCopy(&s, t): 复制
StrEqual(s,t): 比较
StrLength(s): 串长
Concat(s, t): 串连接
SubStr(s,i,j): 求子串
InsStr(s1,i,s2): 插入
DelStr(s,i,j): 删除
RepStr(s,i,j,t): 替换
DispStr(s): 打印
}ADT String
typedef struct
{
char data[MAXSIZE];
int len;
}SqString;
算法代码如下,C语言实现:
#include "stdio.h"
#define MAXSIZE 1024
typedef int ElemType;
typedef struct
{
char data[MAXSIZE];
int len;
}SqString;
void StrAssign(SqString *s,char cstr[])
{
int i ;
if(!s) return ;
for(i = 0; cstr[i] != '\0'; i++)
{
if(i <= MAXSIZE-1)
{
s->data[i] = cstr[i];
}
else
{
break;
}
}
s->len = i;
}
void StrCopy(SqString *s,SqString *t)
{
int i;
if(!s || !t) return ;
for(i=0;i< t->len;i++)
{
s->data[i] = t->data[i];
}
s->len = t->len;
}
int StrEqual(SqString *s,SqString *t)
{
int result=1,i;
if(!s || !t) return 0;
if(s->len != t->len)
result = 0;
else
{
for(i=0; i< s->len; i++)
{
if(s->data[i] != t->data[i])
{
result = 0;
break;
}
}
}
return result;
}
int StrLength(SqString *s)
{
if(!s) return 0;
return s->len;
}
/*
这里没有判断字符串超过MAXSIZE情况
现实项目中必须判断
*/
SqString Concat(SqString *s,SqString *t)
{
SqString str ;
int i;
if(!s || !t) return str;
for(i=0; i < s->len;i++)
str.data[i] = s->data[i];
for(i=0; i < t->len;i++)
str.data[s->len +i] = t->data[i];
str.len = s->len + t->len;
return str;
}
SqString SubString(SqString *s,int i ,int j)
{
SqString str;
int k;
str.len = 0;
if( i<=0 || i> s->len || j<0 || i+j-1 >s->len)
return str;
for( k = i-1; k
str.data[k-i+1] = s->data[k];
str.len = j;
return str;
}
SqString InsStr(SqString *s1, int i, SqString *s2)
{
int j;
SqString str;
str.len = 0;
if( i<=0 || i>s1->len +1)
return str;
for(j=0; j str.data[j] = s1->data[j]; for(j=0; j str.data[i+j-1] = s2->data[j]; for(j=i-1;j str.data[s2->len +j] = s1->data[j]; str.len = s1->len + s2->len; return str; } SqString DelStr(SqString *s,int i,int j) { int k; SqString str; str.len = 0; if(i<=0 || i>s->len || i+j > s->len +1) return str; for(k = 0; k str.data[k] = s->data[k]; for(k=i+j-k; k< s->len; k++) str.data[k-j] = s->data[k]; str.len = s->len -j; return str; } SqString RepStr(SqString *s,int i,int j, SqString *t) { int k; SqString str; str.len = 0; if( i<=0 || i> s->len || i+j-1 > s->len) return str; for(k=0; k str.data[k] = s->data[k]; for(k=0; k< t->len; k++) str.data[i+k-1] = t->data[k]; for(k=i+j-1; k str.data[t->len +k -j] = s->data[k]; str.len = s->len - j + t->len; return str; } void DispStr(SqString *s) { int i; if(s->len >0) { for(i=0;i< s->len ; i++) { printf("%c", s->data[i]); } printf("\n"); } } 链串与一般链表类似。主要区别在于,链串的一个结点,可以存储一个或多个字符。 以结点大小为1,数据类型定义 typedef struct snode { char data; struct snode *next; }LiString; 算法实现,C语言: 因为跟链表类型,这里就不在实现代码,原理也就是链表与链表间的操作,参考链表实现 后面有时间再补上代码 字符串,可以说是程序中,最重要的数据结构之一。因为无论什么语言,还是最后的底层逻辑,很多都会转到最后,为字符串的操作。 在学习C++时,很常用的,就是std::string,但不少人只知道字符串,但产不了解字符串的原理,本文的内容,讲的串,其实就是字符串的原理及在顺序和链表中的实现。学习后会对字符串有深刻的了解,而不仅仅停留在使用std:string中。 简单地说,字符串,其实就是一串char类型的数组,或链表。 (注:代码中可能有些少了判断空指针或少了某些条件,时间比较仓促,如果你拿代码去用,记得一定要补上那些条件,见谅) 4. 串的链式储存结构
5. 串的运用
6. 总结