java 串的顺序存储_算法入门之串的顺序存储表示
串,即字符串。計(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)題。
- 上一篇: linux挂载fc存储有超级坏块_Nan
- 下一篇: html5小游戏是用js做的吗,谁说做H