溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

計(jì)算機(jī)編程中串的三種存儲(chǔ)結(jié)構(gòu)存是什么

發(fā)布時(shí)間:2021-02-03 14:27:34 來源:億速云 閱讀:868 作者:小新 欄目:互聯(lián)網(wǎng)科技

小編給大家分享一下計(jì)算機(jī)編程中串的三種存儲(chǔ)結(jié)構(gòu)存是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

是的,串是一種數(shù)據(jù)對(duì)象和操作都特殊的線性表結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)中提到的串,即字符串;字符串中的字符之間具有“一對(duì)一”的邏輯關(guān)系,所以嚴(yán)格意義上講,串存儲(chǔ)結(jié)構(gòu)是一種線性存儲(chǔ)結(jié)構(gòu)。

本教程操作環(huán)境:windows7系統(tǒng)、Dell G3電腦。

數(shù)據(jù)結(jié)構(gòu)中提到的串,即字符串,由 n 個(gè)字符組成的一個(gè)整體( n >= 0 )。這 n 個(gè)字符可以由字母、數(shù)字或者其他字符組成。

數(shù)據(jù)結(jié)構(gòu)中,字符串要單獨(dú)用一種存儲(chǔ)結(jié)構(gòu)來存儲(chǔ),稱為串存儲(chǔ)結(jié)構(gòu)。

嚴(yán)格意義上講,串存儲(chǔ)結(jié)構(gòu)也是一種線性存儲(chǔ)結(jié)構(gòu),因?yàn)樽址械淖址g也具有"一對(duì)一"的邏輯關(guān)系。只不過,與之前所學(xué)的線性存儲(chǔ)結(jié)構(gòu)不同,串結(jié)構(gòu)只用于存儲(chǔ)字符類型的數(shù)據(jù)。

特殊的串

  • 空串:含有零個(gè)字符的串。例如:S = “”(雙引號(hào)中沒有任何東西),一般直接用 ? 表示。

  • 空格串:只包含空格的串。注意和空串區(qū)分開,空格串中是有內(nèi)容的,只不過包含的是空格,且空格串中可以包含多個(gè)空格。例如,a = ” ”(包含3個(gè)空格)。

  • 子串與主串:串中任意個(gè)連續(xù)字符組成的字符串叫做該串的子串,包含子串的串稱為主串。

例如:a = ”BEI”,b = ”BEIJING”,c = ”BJINGEI” 。對(duì)于字符串 a 和 b 來說,由于 b 中含有連續(xù)的字符串 a ,

所以可以稱 a 是 b 的子串,b 是 a 的主串;而對(duì)于 c 和 a ,雖然 c 中也含有 a 的全部字符,但不是連續(xù)的 “BEI” ,所以串 c 和 a 沒有任何關(guān)系。

子串在主串中的位置:對(duì)于串 a = ”BEI” 來說,首字符 ‘B’ 在串 b 的位置為 1 ,所以子串 a 在主串 b = “BEIJING” 中的位置是 1。

子串在主串中的位置和字符在數(shù)組中的存放位置不同,子串在主串的位置從 1 開始數(shù)。

兩個(gè)串相等的標(biāo)準(zhǔn):如果兩個(gè)串的串值完全相同,那么這兩個(gè)串相等。

串的三種存儲(chǔ)結(jié)構(gòu)存

儲(chǔ)串的結(jié)構(gòu)有三種:

1 定長(zhǎng)順序存儲(chǔ);

2 堆分配存儲(chǔ);

3 塊鏈存儲(chǔ)。

定長(zhǎng)順序存儲(chǔ)

采用固定長(zhǎng)度的數(shù)組(即靜態(tài)數(shù)組)存儲(chǔ)串。

例如:char a[7] = "abcdfg";

此方式存儲(chǔ)串時(shí),需要預(yù)估串的長(zhǎng)度提前申請(qǐng)足夠的存儲(chǔ)空間。目標(biāo)串如果超過了數(shù)組申請(qǐng)的長(zhǎng)度,超出部分會(huì)被自動(dòng)舍棄(稱為“截?cái)唷保?/p>

例如:char a[3] = "abcdfg";//實(shí)際上數(shù)組中只存儲(chǔ)了 “abc” ,后邊的被截?cái)?。堆分配存?chǔ)

采用動(dòng)態(tài)數(shù)組存儲(chǔ)串

在C語言中,存在著一個(gè)被稱之為“堆”的自由存儲(chǔ)區(qū),用 malloc 函數(shù)和 free 函數(shù)管理,malloc 函數(shù)負(fù)責(zé)申請(qǐng)空間,free 函數(shù)負(fù)責(zé)釋放空間。

例如:

char * a = (char*)malloc(5*sizeof(char));//創(chuàng)建 a 數(shù)組,動(dòng)態(tài)申請(qǐng)5個(gè) char 類型數(shù)據(jù)的存儲(chǔ)空間

使用堆分配存儲(chǔ)的優(yōu)勢(shì)在于:當(dāng)發(fā)現(xiàn)申請(qǐng)的空間不夠用時(shí),可以通過 realloc() 函數(shù)重新申請(qǐng)更大的存儲(chǔ)空間。

例如:a = (char*)realloc(a, 10*sizeof(char));//前一個(gè)參數(shù)指申請(qǐng)空間的對(duì)象;第二個(gè)參數(shù),重新申請(qǐng)空間的大小

使用 malloc 函數(shù)申請(qǐng)的存儲(chǔ)空間,不會(huì)自動(dòng)釋放,需要程序員調(diào)用 free() 函數(shù)手動(dòng)釋放。如果不手動(dòng)釋放,當(dāng)程序執(zhí)行徹底結(jié)束,由操作系統(tǒng)進(jìn)行回收。

例如:free(a);//釋放動(dòng)態(tài)數(shù)組a申請(qǐng)的空間

舉一個(gè)完整的例子,連接串 “abc” 和 “defg” 變?yōu)?“abcdefg” ;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char * a1=NULL;
    char * a2=NULL;
    
    a1=(char*)malloc(3*sizeof(char));
    strcpy(a1, "abc");//將字符串“abc”復(fù)制給a1
    
    a2=(char*)malloc(3*sizeof(char));
    strcpy(a2, "defg");
    
    int lengthA1=strlen(a1);
    int lengthA2=strlen(a2);
    if (lengthA1<lengthA1+lengthA2) {
        a1=(char*)realloc(a1, (lengthA1+lengthA2)*sizeof(char));
    }
    int i;
    for (i=lengthA1; i<lengthA1+lengthA2; i++) {
        a1[i]=a2[i-lengthA1];
    }
    printf("%s",a1);
    
    free(a1);
    free(a2);
    return 0;
}

計(jì)算機(jī)編程中串的三種存儲(chǔ)結(jié)構(gòu)存是什么

注:在程序中,我們給 a1 和 a2 賦值的時(shí)候,使用了 strcpy 復(fù)制函數(shù)。在這里不能直接用:a1 = ”abc”這種方式,

如果你這樣做,程序編譯會(huì)出錯(cuò),告訴你,沒有 malloc 的空間不能 free 。

原因是: strcpy 函數(shù)是將字符串復(fù)制到申請(qǐng)的存儲(chǔ)空間中,而直接賦值是字符串存儲(chǔ)在別的內(nèi)存空間(本身是一個(gè)常量,放在常量區(qū))中,

更改了指針 a1 和 a2 的指向,也就是說,之前動(dòng)態(tài)申請(qǐng)的存儲(chǔ)空間雖然申請(qǐng)了,結(jié)果還沒用呢就丟了。

塊鏈存儲(chǔ)

塊鏈存儲(chǔ),其實(shí)就是借用鏈表的存儲(chǔ)結(jié)構(gòu)來存儲(chǔ)串。一般情況下使用單鏈表就足夠了,而且不需要增設(shè)頭結(jié)點(diǎn)。

在構(gòu)建鏈表時(shí),每個(gè)結(jié)點(diǎn)可以存放一個(gè)字符,也可以存放多個(gè)字符。

計(jì)算機(jī)編程中串的三種存儲(chǔ)結(jié)構(gòu)存是什么

鏈表中最后一個(gè)結(jié)點(diǎn)的數(shù)據(jù)域不一定全被串值占滿,通常會(huì)補(bǔ)上 “#” 或者其他特殊的字符和字符串中的字符區(qū)分開。

每個(gè)結(jié)點(diǎn)設(shè)置字符數(shù)量的多少和存儲(chǔ)的串的長(zhǎng)度、可以占用的存儲(chǔ)空間以及程序?qū)崿F(xiàn)的功能相關(guān)。

如果串包含數(shù)據(jù)量很大,但是可用的存儲(chǔ)空間有限,那么就需要提高空間利用率,相應(yīng)地減少結(jié)點(diǎn)數(shù)量(因?yàn)槎嘁粋€(gè)節(jié)點(diǎn),就多申請(qǐng)一個(gè)指針域的空間)。

而如果程序中需要大量地插入或者刪除數(shù)據(jù),如果每個(gè)節(jié)點(diǎn)包含的字符過多,操作字符就會(huì)變得很麻煩,為實(shí)現(xiàn)功能增加了障礙。

總結(jié)

在平時(shí)編寫程序,經(jīng)常會(huì)用到例如:char *a = ”abcd”;這種方式表示字符串,和上面三種存儲(chǔ)方式最主要的區(qū)別是:這種方式用于表示常量字符串,只能使用,不能對(duì)字符串內(nèi)容做修改(否則程序運(yùn)行出錯(cuò));而以上三種方式都可以對(duì)字符串進(jìn)行刪改的操作。

例如:

#include <stdio.h>
int main() {
    char* a="abcd";
    a[1]='b';
    return 0;
}

程序編譯可以通過,運(yùn)行失敗,改成下面堆分配存儲(chǔ)的方式就對(duì)了:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    char * a=(char*)malloc(4*sizeof(char));
    strcpy(a, "abcd");
    a[1]='e';
    printf("%s",a);
    return 0;
}

計(jì)算機(jī)編程中串的三種存儲(chǔ)結(jié)構(gòu)存是什么

三種存儲(chǔ)表示方式中,最常用的是堆分配存儲(chǔ),因?yàn)樗诙ㄩL(zhǎng)存儲(chǔ)的基礎(chǔ)上通過使用動(dòng)態(tài)數(shù)組,避免了在操作串時(shí)可能因?yàn)樯暾?qǐng)存儲(chǔ)空間的不足而丟失字符數(shù)據(jù);和塊鏈存儲(chǔ)方式相比,結(jié)構(gòu)相對(duì)簡(jiǎn)單,更容易操作。

以上是“計(jì)算機(jī)編程中串的三種存儲(chǔ)結(jié)構(gòu)存是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI