第3章 串
【例3-1】已知字符串:a=“an apple”,b=“other hero”,c=“her”,求:
(1)concat(substr(a,1,2),b)。
(2)replace(a,substr(a,5,1),c)。
(3)index(a,c)和index(b,c)。
解:
(1)返回值為“another hero”,其中substr(a,1,2)的返回值為“an”。
(2)返回值為“an aherherle”,其中substr(a,5,1)的返回值為“p”。
(3)返回值分別為0和3。
//串的第一個元素就是下標為1的元素
連接// cat順序連接子串
取代//replace(s,i,t)用串t取代s中i
求子串// substr(s,i,len) 取出s串中位置為i長度為len的串
查找//index(s,t) 返回s串中t首次出現的位置,沒有返回0(這道題子串是her)
other
刪除//delstr(s,t,len) 刪除串s中第i個字符起長度為len的子串
插入//insstr(s,t,i)將串t插入串s中的第i個字符前
3.串的順序存儲結構(順序串)
串的順序存儲方式類似於線性表的順序存儲方式,其存儲結構用C語言描述為:
typedef struct strnode {
char data[maxlen];
int len;
}SeqString; //定義順序串類型
【例3-2】設定串采用順序存儲結構,寫出對串s1和串s2比較大小的算法。串值大小按字典排序(升序)方式,返回值等於-1,0和1分別表示s1<s2,s1=s2和s1>s2。
解: 算法思想:
(1)比較s1和s2共同長度范圍內的對應字符:
若s1的字符>s2的字符,返回;
若s1的字符<s2的字符,返回;
若s1的字符=s2的字符,按上述規則繼續比較;
(2)當(1)中對應字符均相同時,比較和的長度:
兩者相等時,返回0;
前者>后者時,返回1;
前者<后者時,返回-1;
算法描述如下:
#define MAXLEN 256
struct strnode{
char data[MAXLEN];
int len;
}SeqString; //定義順序串類型
int strcmp(SeqString s1, SeqString s2)//比較串s1和串s2的大小
{ int comlen;
if (s1.len<s2.len) comlen=s1.len; //求出串s1和串s2的共同長度
else comlen=s2.len;
for(i=0;i<comlen;i++) //在共同長度內逐個字符比較
if(s1.ch[i]<s2.ch[i]) return (-1); //s1<s2
else
if(s1.ch[i]>s2.ch[i]) return (1); //s1>s2
if(s1.ch[i]= =s2.ch[i]) return (0); //s1=s2
else
if(s1.ch[i]<s2.ch[i]) return (-1); //s1<s2
else return (1); //s1>s2
}
習題3
一、單項選擇題
1. 空串與空格字符組成的串的區別在於(1.B )。
A.沒有區別 B.兩串的長度不相等
C.兩串的長度相等 D.兩串包含的字符不相同
2. 一個子串在包含它的主串中的位置是指( 2.D)。
A.子串的最后那個字符在主串中的位置
B.子串的最后那個字符在主串中首次出現的位置
C.子串的第一個字符在主串中的位置
D.子串的第一個字符在主串中首次出現的位置
3. 下面的說法中,只有( 3.C )是正確的。
A.字符串的長度是指串中包含的字母的個數
B.字符串的長度是指串中包含的不同字符的個數
C.若T包含在S中,則T一定是S的一個子串
D.一個字符串不能說是其自身的一個子串
4. 兩個字符串相等的條件是(4.D )。
A.兩串的長度相等
B.兩串包含的字符相同
C.兩串的長度相等,並且兩串包含的字符相同
D.兩串的長度相等,並且對應位置上的字符相同
5. 若SUBSTR(S,i,k)表示求S中從第i個字符開始的連續k個字符組成的子串的操作,則對於S=“Beijing&Nanjing”,SUBSTR(S,4,5)=( 5.B )。
A. “ijing” B. “jing&”
C. “ingNa” D. “ing&N”
//字符串中&就是表示字符串
6. 若INDEX(S,T)表示求T在S中的位置的操作,則對於S=“Beijing&Nanjing”,T=“jing”,INDEX(S,T)=(6.C)。
A.2 B.3 C.4 D.5
7. 若REPLACE(S,S1,S2)表示用字符串S2替換字符串S中的子串S1的操作,則對於S=“Beijing&Nanjing”,S1=“Beijing”,S2=“Shanghai”,REPLACE(S,S1,S2)=( 7.D )。
A. “Nanjing&Shanghai” B. “Nanjing&Nanjing”
C. “ShanghaiNanjing” D. “Shanghai&Nanjing”
8. 在長度為n的字符串S的第i個位置插入另外一個字符串,i的合法值應該是( 8.C )。
A.i>0 B. i≤n
C.1≤i≤n D.1≤i≤n+1
9. 字符串采用結點大小為1的鏈表作為其存儲結構,是指(9.D )。
A.鏈表的長度為1
B.鏈表中只存放1個字符
C.鏈表的每個鏈結點的數據域中不僅只存放了一個字符
D.鏈表的每個鏈結點的數據域中只存放了一個字符1
二、填空題
1. 計算機軟件系統中,有兩種處理字符串長度的方法:一種是____固定長度_______,第二種是______________設置長度指針_____。
2. 兩個字符串相等的充要條件是________兩個串的長度相等_____________和___________對應位置的字符相等________。
3. 設字符串S1= “ABCDEF”,S2= “PQRS”,則運算S=CONCAT(SUB(S1,2,LEN(S2)),SUB(S1,LEN(S2),2))后的串值為_________ BCDEDE __________。
4. 串是指___________含n個字符的有限序列 (n≥0)________。
5. 空串是指________不含任何字符的串___________,空格串是指______僅含空格字符的字符串_____________。
三、算法設計題
1. 設有一個長度為s的字符串,其字符順序存放在一個一維數組的第1至第s個單元中(每個單元存放一個字符)。現要求從此串的第m個字符以后刪除長度為t的子串,m<s,t<(s-m),並將刪除后的結果復制在該數組的第s單元以后的單元中,試設計此刪除算法。
1.算法描述為:
int delete(r,s,t,m) //從串的第m個字符以后刪除長度為t的子串
char r[ ];
int s,t,m;
{ int i,j;
for(i=1;i<=m;i++)
r[s+i]=r[i];
for(j=m+t-i;j<=s;j++)
r[s-t+j]=r[j];
return (1);
} //delete
2. 設s和t是表示成單鏈表的兩個串,試編寫一個找出s中第1個不在t中出現的字符(假定每個結點只存放1個字符)的算法。
2.算法思想為:
(1)鏈表s中取出一個字符;將該字符與單鏈表t中的字符依次比較;
(2)當t中有與從s中取出的這個字符相等的字符,則從t中取下一個字符重復以上比較;
(3)當t中沒有與從s中取出的這個字符相等的字符,則算法結束。
設單鏈表類型為LinkList;注意,此時類型 LinkList中的data成分為字符類型。
LinkString find(s,t)
LinkString *s, *t;
{ LinkString *ps, *pt;
ps=s;
while(ps!=NULL)
{ pt=t;
while((pt!=NULL)&&(ps->data!=pt->data))
pt=pt->next;
if(pt= =NULL)
ps=NULL;
else
{ ps=ps->next;
s=ps;
}
}
return s;
} //find