串-第4章-《數據結構題集》答案解析-嚴蔚敏吳偉民版


習題集解析部分

第4章 串

——《數據結構題集》-嚴蔚敏.吳偉民版

       源碼使用說明  鏈接☛☛☛ 《數據結構-C語言版》(嚴蔚敏,吳偉民版)課本源碼+習題集解析使用說明

       課本源碼合輯  鏈接☛☛☛ 《數據結構》課本源碼合輯

       習題集全解析  鏈接☛ 《數據結構題集》習題解析合輯

 

      相關測試數據下載  鏈接☛ 數據包

 

      本習題文檔的存放目錄:數據結構\▼配套習題解析\▼04 串

      文檔中源碼的存放目錄:數據結構\▼配套習題解析\▼04 串\▼習題測試文檔-04

      源碼測試數據存放目錄:數據結構\▼配套習題解析\▼04 串\▼習題測試文檔-04\Data

 

一、基礎知識題

4.1❶簡述空串和空格串(或稱空格符串)的區別。

 

4.2❷對於教科書4.1節中所述串的各個基本操作,討論是否可由其他基本操作構造而得,如何構造?

 

4.3❶設s = ‘I AM A STUDENT’,t = ‘GOOD’,q = ‘WORKER’。

求:StrLength(s),StrLength(t),SubString(s, 8, 7),SubString(t, 2, 1),Index(s, ‘A’),Index(s, t),Replace(s, ‘STUDENT’, q),Concat(SubString(s, 6, 2), Concat(t, SubString(s, 7, 8)))。

 

4.4❶已知下列字符串

    a = ‘THIS’, f = ‘A SAMPLE’, c = ‘GOOD’, d = ‘NE’, b = ‘ ’.

    s = Concat(a, Concat(SubString(f, 2, 7), Concat(b, SubString(a, 3, 2)))),

    t = Replace(f, SubString(f, 3, 6), c),

    u = Concat(SubString(c, 3, 1), d),

    g = ‘IS’,

    v = Concat(s, Concat(b, Concat(t, Concat(b, u)))),

  試問:s,t,v,StrLength(s),Index(v, g),Index(u, g)各是什么?

 

4.5❶試問執行以下函數會產生怎樣的輸出結果?

    void demonstrate()

    {

        StrAssign(s, ‘THIS IS A BOOK’);

        Replace(s, SubString(s, 3, 7), ‘ESE ARE’);

        StrAssign(t, Concat(s, ‘S’));

        StrAssign(u, ‘XYXYXYXYXYXY’);

        StrAssign(v, SubString(u, 6, 3));

        StrAssign(w, ‘W’);

        printf(‘t=’, t, ‘v=’, v, ‘u=’, Replace(u, v, w));

    }//demonstrate

 

4.6❷已知:s = ‘(XYZ)+*’,t = ‘(X+Z)*Y’。試利用聯接、求子串和置換等基本運算,將s轉化為t。

 

4.7❷令s = ‘aaab’,t = ‘abcabaa’,u = ‘abcaabbabcabaacbacba’。試分別求出它們的next函數值和nextval函數值。

 

4.8❷已知主串s = ‘ADBADABBAABADABBADADA’,

        模式串pat = ‘ADABBADADA’,

  寫出模式串的nextval函數值,並由此畫出KMP算法匹配的全過程。

 

4.9❸在以鏈表存儲串值時,存儲密度是結點大小和串長的函數。假設每個字符占一個字節,每個指針占4個字節,每個結點的大小為4的整數倍,已知串長的分布函數為f(l)且,求結點大小為4k,串長為l時的存儲密度d(4k, l)(用公式表示)。

 

二、算法設計題

    在編寫4.10至4.14題的算法時,請采用StringType數據類型:

    StringType是串的一個抽象數據類型,它包含以下五種基本操作:

    void StrAssign (StringType &t, StringType s);    //將s的值賦給t。s的實際參數可以是串變量或者串常量(如:‘abcd’)。

    int StrCompare (StringType s, StringType t);   //比較s和t。若s>t,返回值>0;若s=t,返回值=0;若s<t,返回值<0。

    int StrLength (StringType s);           //返回s中的元素個數,即該串的長度。

    StringType Concat (StringType s, StringType t);   //返回由s和t聯接而成的新串。

    StringType SubString (StringType s, int start, int len) ; //當1≤start≤StrLength(s)且0≤len≤StrLength(s)-start+1時,返回s中第start個字符起長度為len的子串,否則返回空串。

 

順序串

4.10❸編寫對串求逆的遞推算法。

 

4.11❸編寫算法,求得所有包含在串s中而不包含在串t中的字符(s中重復的字符只選一個)構成的新串r,以及r中每個字符在s中第一次出現的位置。

 

4.12❸編寫一個實現串的置換操作Replace(&S, T, V)的算法。

 

4.13❸編寫算法,從串s中刪除所有和串t相同的子串。

 

4.14❹利用串的基本操作以及棧和集合的基本操作,編寫“由一個算術表達式的前綴式求后綴式”的遞推算法(假設前綴式不含語法錯誤)。

 

        在編寫4.15至4.20題的算法時,請采用教科書4.2.1節中所定義的定長順序存儲表示,而不允許調用串的基本操作。

 

4.15❸編寫算法,實現串的基本操作StrAssign(&T, chars)。

4.16❸編寫算法,實現串的基本操作StrCompare(S, T)。

4.17❸編寫算法,實現串的基本操作Replace(&S, T, V)。

 

4.18❸編寫算法,求串s所含不同字符的總數和每種字符的個數。

 

4.19❸在串的定長順序存儲結構上直接實現4.11題要求的算法。

 

4.20❸編寫算法,從串s中刪除所有和串t相同的子串。

 

 

塊鏈串

4.21❹假設以結點大小為1(且附設頭結點)的鏈表結構表示串。試編寫實現下列六種串的基本操作StrAssign,StrCopy,StrCompare,StrLength,Concat和SubString的函數。

 

4.22❹  假設以塊鏈結構表示串。試編寫將串s插入到串t中某個字符之后的算法(若串t中不存在此字符,則將串s聯接在串t的末尾)。

 

 

4.23❹假設以塊鏈結構作串的存儲結構。試編寫判別給定串是否具有對稱性的算法,並要求算法的時間復雜度為O(StrLength(S))。

 

堆串

 

        在編寫4.24至4.26題的算法時,請采用教科書4.2.2節中所定義的堆分配存儲表示。

 

4.24❸試寫一算法,在串的堆存儲結構上實現串基本操作Concat(&T, s1,s2)。

4.25❸試寫一算法,實現堆存儲結構的串的置換操作Replace(&S, T, V)。

4.26❸試寫一算法,實現堆存儲結構的串的插入操作 StrInsert(&S, pos, T)。

 

順序串

4.27❸當以教科書4.2.1節中定義的定長順序結構表示串時,可如下所述改進定位函數的算法:先將模式串t中的第一個字符和最后一個字符與主串s中相應的字符比較,在兩次比較都相等之后,再依次從t的第二個字符逐個比較。這樣做可以克服算法Index(算法4.5)在求模式串’akb’(ak表示連續k個字符’a’)在主串’anb’(k≤n)中的定位函數時產生的弊病。試編寫上述改進算法,並比較這兩種算法在作Index(’anb’,’akb’)運算時所需進行的字符間的比較次數。

 

塊鏈串

4.28❹假設以結點大小為1(帶頭結點)的鏈表結構表示串,則在利用next函數值進行串匹配時,在每個結點中需設三個域:數據域chdata、指針域succ和指針域next。其中chdata域存放一個字符;succ域存放指向同一鏈表中后繼結點的指針;next域在主串中存放指向同一鏈表中前驅結點的指針;在模式串中,存放指向當該結點的字符與主串中的字符不等時,在模式串中下一個應進行比較的字符結點(即與該字符的next函數值相對應的字符結點)的指針,若該節點字符的next函數值為0,則其next域的值應指向頭結點。試按上述定義的結構改寫求模式串的next函數值的算法。

4.29❹試按4.28題定義的結構改寫串匹配的改進算法(KMP算法)。

 

順序串

4.30❺假設以定長順序存儲結構表示串,試設計一個算法,求串s中出現的第一個最長重復子串及其(第一次出現的)位置,並分析你的算法的時間復雜度。

 

4.31❺假設以定長順序存儲結構表示串,試設計一個算法,求串s和串t的一個最長公共子串,並分析你的時間復雜度。若要求第一個出現的最長公共子串(即它在串s和串t的最左邊的位置上出現)和所有的最長公共子串,討論你的算法能否實現。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM