C語言 數(shù)據(jù)結(jié)構(gòu)與算法之字符串詳解

串的定義
零個(gè)或多個(gè)字符組成的有限序列


串的比較
串的比較實(shí)際上是在比較串中字符的編碼
存在某個(gè)k < min(n,m),使得ai = bi (i = 1,2,3,4..k)
如果 ak < bk --> 那么srt1 < srt2 (反之也成立)
除去相等的字符,在第一個(gè)不相等的字符位置以Ascii碼進(jìn)行比較
串的抽象數(shù)據(jù)類型

串的順序存儲(chǔ)結(jié)構(gòu)示意圖

串的順序存儲(chǔ)結(jié)構(gòu)是用一組地址連續(xù)的存儲(chǔ)單元來存儲(chǔ)串中的字符序列

typedef struct sqString{
char* ch; //若串為空,則按串長分配存儲(chǔ)區(qū)
//否則ch = NULL
int length;//串長
}sqString;串的初始化
相關(guān)定義初始化

/** 狀態(tài)碼 **/ #define TRUE 1 #define FALSE 0 #define EQ 0 #define GT 1 //大于 #define LT -1 //小于
定長類初始化

#define MAX_SIZE 1024
typedef struct{
char ch[MAX_SIZE + 1];
//定長方式實(shí)現(xiàn)了字符串的順序結(jié)構(gòu)--缺點(diǎn)是浪費(fèi)空間
int length;
}SString;
串的堆式順序存儲(chǔ)結(jié)構(gòu)(Heap)

/** 串的堆式順序存儲(chǔ)結(jié)構(gòu)(Heap)**/
typedef struct{
char * ch;
//如果是非空串,那么就按照指定長度分配內(nèi)存,否則ch就指向NULL
int length; //串當(dāng)前長度
}HString;
初始化堆字符串
賦值操作
/** 為串str賦值,值為字符串常量chars **/
void StrAssign_HeapString(HString * str,char * chars){
int len = strlen(chars);
if(!len) return ERROR;
InitString_HeapString(str);
//動(dòng)態(tài)為字符串分配空間
str->ch = (char*)malloc(len * sizeof(char));
if(!str->ch){
exit(OVERFLOW); //內(nèi)存溢出,分配失敗
}
//逐個(gè)將字符串輸入所分配的空間中
for(int i = 0;i < len ; i++)
{
str->ch[i] = chars[i];
}
str->length = len; //將長度賦值
return OK;
}
比較兩個(gè)堆字符串的大小
str1 == str2 返回0 ; str1 < str2 返回-1 ; str1 > str2 返回1
Status Strcmp_HeapString(HString * str1,HString * str2){
for(int i = 0;i < str->length && i < str2->length; i ++){
//遇到不同的字符就直接比較Ascii
if(str->ch[i] != str[2]->ch[i]){
//大于則返回整數(shù),小于則返回負(fù)數(shù)
return str->ch[i] - str[2]->ch[i];
}
}
//字符都相等但是長度不等,就比較長度
return str1->length - str2->length;
}
到此這篇關(guān)于C語言 數(shù)據(jù)結(jié)構(gòu)與算法之字符串詳解的文章就介紹到這了,更多相關(guān)C語言 字符串內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++類與對象深入之運(yùn)算符重載與const及初始化列表詳解
運(yùn)算符是程序中最最常見的操作,例如對于內(nèi)置類型的賦值我們直接使用=賦值即可,因?yàn)檫@些編譯器已經(jīng)幫我們做好了,但是對象的賦值呢?能直接賦值嗎2022-06-06
MoveWindow() SetWindowPos()的區(qū)別于聯(lián)系
這篇文章主要介紹了VC++中MoveWindow() SetWindowPos()的區(qū)別于聯(lián)系,需要的朋友可以參考下2015-01-01
C++實(shí)現(xiàn)LeetCode(65.驗(yàn)證數(shù)字)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(65.驗(yàn)證數(shù)字),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語言實(shí)現(xiàn)動(dòng)態(tài)順序表的實(shí)現(xiàn)代碼
這篇文章主要介紹了C語言實(shí)現(xiàn)動(dòng)態(tài)順序表的實(shí)現(xiàn)代碼的相關(guān)資料,動(dòng)態(tài)順序表在內(nèi)存中開辟一塊空間,可以隨我們數(shù)據(jù)數(shù)量的增多來擴(kuò)容,需要的朋友可以參考下2017-08-08
C語言模擬實(shí)現(xiàn)memmove的示例代碼
memmove函數(shù)用于拷貝字節(jié),如果目標(biāo)區(qū)域和源區(qū)域有重疊的話,memmove能夠保證源串在被覆蓋之前將重疊區(qū)域的字節(jié)拷貝到目標(biāo)區(qū)域中,但復(fù)制后源內(nèi)容會(huì)被更改。本文主要介紹了C語言模擬實(shí)現(xiàn)memmove的示例代碼,需要的可以參考一下2022-12-12

