資料結構,資料結構與演算法

來源:互聯網
上載者:User

資料結構,資料結構與演算法
串的基本概念

字串:應用在非數值處理、交易處理等領域。
電腦的硬體:主要是反映數值計算的要求。
字串的處理比具體數值處理複雜。
串(字串):是零個或多個字元組成的有限序列。記作: 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  256typedef  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中不存在。
模式比對的應用在非常廣泛。例如,在搜尋引擎和文本編輯程式中,我們經常要尋找某一特定單詞在文本中出現的位置。顯然,解此問題的有效演算法能極大地提高文本編輯程式的響應效能。
模式比對是一個較為複雜的串操作過程。迄今為止,人們對串的模式比對提出了許多思想和效率各不相同的電腦演算法。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.