數據結構 - 串的存儲表示和實現

串的基本概念

字符串:應用在非數值處理、事務處理等領域。
計算機的硬件:主要是反映數值計算的要求。
字符串的處理比具體數值處理複雜。
串(字符串):是零個或多個字符組成的有限序列。記作: S=“a1a2a3…”,其中S是串名,ai(1≦i≦n)是 單個字符,可以是字母、數字或其它字符。

串值:雙引號括起來的字符序列,引號不屬於串的內容。

串長:串中所包含的字符個數。

 空串(空的字符串):長度爲零的串,它不包含任何字符。

空格串(空白串):構成串的所有字符都是空格。 

注意:空串和空白串的不同,空格串是有內容有長度的,而且可以不止一個空格;例如“   ”和“”分別表示長度爲3的空白串和長度爲0的空串。

子串(substring):串中任意個連續字符組成的子序列稱爲該串的子串,包含子串的串相應地稱爲主串。

子串的序號:子串在主串中首次出現時,該子串的首字符對應在主串中的序號,稱爲子串在主串中的序號(或位置)。

例如,A=“This is a string”,B=“is”,
B是A的子串,A爲主串。
B在A中的序號爲3 。
特別地,空串是任意串的子串,任意串是其自身的子串。

串的基本操作

對於串的基本操作,許多高級語言均提供了相應的運算或標準庫函數來實現。下面先介紹幾種在C語言中常用的串運算。
定義下列幾個變量:

     char s1[20]=“dirtreeformat”;
     char s2[20]=“file.mem”;
     char s3[30], *p;
     int result;
1)求串長(length)
       int strlen(char *s);  //求串的長度
    例如:printf(“%d”,strlen(s1)); 輸出13
2)串複製(copy)
      char *strcpy(char *to,char *from);
     該函數將串from複製到串to中,並且返回一個指向串to的開始處的指針。
  例如:strcpy(s3,s1);   //s3=“dirtreeformat”
(3)聯接(concatenation)

    char * strcat(char *to,char *from)
   該函數將串from複製到串to的末尾,並且返回一個指向串to的開始處的指針。

 例如:strcat(s3,”/”);
            strcat(s3,s2);  //s3=“dirtreeformat/file.mem”
(4)串比較(compare)

 int strcmp(char *s1,char *s2);
   該函數比較串s1和串s2的大小,當返回值<0,=0或>0時分別表示s1<s2、s1=s2或s1>s2

例如:result=strcmp(“baker”,”Baker”)   result>0
           result=strcmp(“12”,”12”);             result=0
           result=strcmp(“Joe”,”Joseph”);  result<0
5)字符定位(index)

     int strchr(char *s, char c);
    該函數是找c在字符串中第一次出現的位置,若找到則返回該位置,否則返回NULL。

串的存儲表示和實現

串是一種特殊的線性表,其存儲表示和線性表類似,但又不完全相同。串在計算機中有3種表示方式:

◆ 定長(靜態)順序存儲表示:將串定義成字符數組,利用串名可以直接訪問串值。用這種表示方式,串的存儲空間在編譯時確定,其大小不能改變。
◆ 堆分配(動態順序)存儲方式:仍然用一組地址連續的存儲單元來依次存儲串中的字符序列,但串的存儲空間是在程序運行時根據串的實際長度動態分配的。
◆ 塊鏈存儲方式:是一種鏈式存儲結構表示。

串的定長順序存儲表示

這種存儲結構又稱爲串的順序存儲結構。所謂定長順序存儲結構,是直接使用定長的字符數組來定義,數組的上界預先確定。
定長順序存儲結構定義爲:

#define MAX_STRLEN  256
typedef  struct
{  char  str[MAX_STRLEN] ;
int  length;
} StringType ;   
1  串的聯結操作
Status  StrConcat ( StringType  *s, StringType t)
/*  將串t聯結到串s之後,結果仍然保存在s中  */
{  int i,  j ;
if ((s->length +t->length)>MAX_STRLEN)
return ERROR ;   /*  聯結後長度超出範圍  */
 for (i=0 ; i<t->length ; i++)
s-> str[s->length+i]=t->str[i] ;  /* 串t聯結到串s之後  */
s->length= s->length+ t->length ;  /* 修改聯結後的串長度 */
return OK ;
}
1  串的聯結操作
Status  StrConcat(HString  *T, HString  s1, HString  s2)
/*  用T返回由s1和s2聯結而成的串  */  
{   int k,  j , t_len ; 
if (T.ch)  free(T);     /*  釋放舊空間   */
T-> length =s1.length+s2.length ;
if (( T->ch=(char *)malloc(sizeof((char)*t_len))==NULL)
{   printf(“系統空間不夠,申請空間失敗 !\n”) ; 
return ERROR  ;     }
for ( j=0 ; j<s1.length; j++ ) 
T->ch[j]=s1.ch[j] ;    /*  將串s1複製到串T中 */
for ( j=s1.length, k=0 ; k<s2.length; k++, j++) 
T->ch[j]=s2.ch[k] ;    /*  將串s2複製到串T中 */
return OK ;   
}

串的模式匹配算法

模式匹配(模範匹配):子串在主串中的定位稱爲模式匹配或串匹配(字符串匹配) 。模式匹配成功是指在主串S中能夠找到模式串T,否則,稱模式串T在主串S中不存在。
模式匹配的應用在非常廣泛。例如,在搜索引擎和文本編輯程序中,我們經常要查找某一特定單詞在文本中出現的位置。顯然,解此問題的有效算法能極大地提高文本編輯程序的響應性能。
模式匹配是一個較爲複雜的串操作過程。迄今爲止,人們對串的模式匹配提出了許多思想和效率各不相同的計算機算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章