日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java 串的顺序存储_算法入门之串的顺序存储表示

發(fā)布時(shí)間:2025/3/12 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 串的顺序存储_算法入门之串的顺序存储表示 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

串,即字符串。計(jì)算機(jī)上的非數(shù)值處理的對(duì)象基本上是字符串?dāng)?shù)據(jù)。但是,由于現(xiàn)在我們使用的計(jì)算機(jī)硬件結(jié)構(gòu)主要是反映數(shù)值計(jì)算的需要的,在處理字符串?dāng)?shù)據(jù)時(shí)比處理整數(shù)和浮點(diǎn)數(shù)要復(fù)雜的多。而且,對(duì)于不同類(lèi)型程序,所處理的字符串具有不同的特點(diǎn),要有效地實(shí)現(xiàn)字符串的處理,就必須根據(jù)具體情況使用合適的存儲(chǔ)結(jié)構(gòu)。串的存儲(chǔ)表示主要有:1.定長(zhǎng)順序存儲(chǔ)表示; 2. 堆分配存儲(chǔ)表示; 3.塊鏈存儲(chǔ)表示。

以下介紹比較簡(jiǎn)單的定長(zhǎng)順序存儲(chǔ)表示。

串定長(zhǎng)順序存儲(chǔ)表示,說(shuō)白了,就是用以個(gè)固定長(zhǎng)度字符數(shù)組來(lái)存放。

1.定義“頭部”

#define MAXSTRLEN 255 //所能定義的最大串長(zhǎng)

typedef unsigned char SString[MAXSTRLEN + 1]; //數(shù)組中下標(biāo)0的位置,用來(lái)存放,當(dāng)前串的長(zhǎng)度

2.初始化

Status InitStr(SString &T)

{

T[0] = 0;//初始化唯一要做的事。定義串當(dāng)前長(zhǎng)度為0。

return OK;

}3.把一個(gè)字符數(shù)組賦給SString。。

Status StrAssign(SString &T, char *chars)

{

int len = strlen(chars);

if (len > MAXSTRLEN)

return ERROR;

T[0] = len;

for (int i = 0; i < len; i++)

{

T[i + 1] = chars[i];

}

return OK;

}

也許看到在這,你會(huì)問(wèn),SString本身是一個(gè)字符數(shù)組,為什么又要用一個(gè)字符數(shù)組去賦給SString?

其實(shí)不然,SString相對(duì)與字符數(shù)組,已經(jīng)有所不同了,它以數(shù)組中下標(biāo)0的位置存放串當(dāng)前的實(shí)際長(zhǎng)度。PASCAL語(yǔ)言中就是使用這個(gè)串類(lèi)型的表示方法。

而對(duì)于char *chars = "12345",要像把它賦給另一個(gè)字符數(shù)組如char chars1[n],那么這里的n值必須大于等于6。因?yàn)镃語(yǔ)言在字符串末位加了'\0'作為結(jié)束標(biāo)志符。但是有的編譯器如gcc不檢測(cè)這錯(cuò)誤。

4.串的比較

Status StrCompare(SString S, SString T)

{

for (int i = 1; i <= S[0] && i <= T[0]; i++)

{

if (S[i] != T[i])

{

return S[i] - T[i]; //返回第一組不同的字符間的差

}

}

return T[0] - S[0];//若其中一個(gè)字符串剛好是另一個(gè)的子串,返回兩字符串之間的長(zhǎng)度差。

}

5.從S下標(biāo)為pos開(kāi)始,取長(zhǎng)度len的子串Sub。

Status SubString(SString S, SString &Sub, int pos, int len)

{

if (pos < 1 || pos > S[0] || len < 1 || len > S[0] - pos + 1)

return ERROR;

Sub[0] = len;

for (int i = 1; i <= len; i++)

{

Sub[i] = S[pos + i - 1];

}

return OK;

}

6.串的合并:S1,S2合并為S

Status Contact(SString &S, SString S1, SString S2)

{

int i = 0;

int j = 0;

if (S1[0] + S2[0] <= MAXSTRLEN) //第一種情況,兩串長(zhǎng)度的和小于所定義的串的最大存儲(chǔ)長(zhǎng)度

{

S[0] = S1[0] + S2[0];

for (i = 1; i <= S1[0]; ++i)

S[i] = S1[i];

for (j = 1; j <= S2[0]; ++i, ++j)

S[i] = S2[j];

return OK;

} else if (S1[0] < MAXSTRLEN) //第二種情況,S1能完全存入S,S2可能被截?cái)嗷蛘咭粋€(gè)都不存入

{

S[0] = MAXSTRLEN;

for (i = 1; i <= S1[0]; i++)

{

S[i] = S1[i];

}

for (j = 1; i <= MAXSTRLEN; ++i, ++j)

S[i] = S2[j];

return OK;

} else) //第三種情況,連S1也被截?cái)?/p>

{

S[0] = MAXSTRLEN;

for (i = 1; i <= MAXSTRLEN; i++)

{

S[i] = S1[i];

}

return OK;

}

}

7.模式匹配的一種改進(jìn)算法:KMP算法

void get_next(SString T, int next[])

{

int i = 1;

next[1] = 0;

int j = 0;

while (i < T[0])

{

if (j == 0 || T[i] == T[j])

{

++i;//執(zhí)行先++j,再執(zhí)行next[i] = j。

++j;//因?yàn)槭窃诖械趈+1字符前有長(zhǎng)度為j的最長(zhǎng)子串,與從首字符起長(zhǎng)度為j的子串相等。next[i] = j;//注意其上的前提是已經(jīng)T[i] == T[j]。

} else

j = next[j];

}

}//S為主串,T為要查找的模式串

Status Index_KMP(SString S, SString T, int pos)

{

int *next = new int();

get_next(T, next);

int i = pos, j = 1; //i為T(mén)開(kāi)始匹配的位置 ,

while (i <= S[i] && j <= T[0])

{

if (j == 0 || S[i] == T[j])

{

++i;

++j;

} else

j = next[j];//j != 0 且 S[i] != T[j],S[i]與T[next[j]]比較

}

if (j > T[0])

return i - T[0];//匹配成功

else

return 0;

}

總結(jié)

以上是生活随笔為你收集整理的java 串的顺序存储_算法入门之串的顺序存储表示的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。