資料結構:字串的基本操作
字串(string)是由0個或多個字元組成的有限序列。一般使用順序儲存結構,末尾以’\0’表示結束,但不計入字串的長度。
示例程式:(改編自《大話資料結構》
#include<iostream>
using namespace std;
#define MAXSIZE 20
typedef char String[MAXSIZE + 1]; //以'\0'結尾
/* 生成一個串*/
bool StrAssign(String Dest, char *ptr)
{
cout << "Assign Str ..." << endl;
int i;
for (i = 0; ptr[i] != '\0' && i < MAXSIZE; i++)
Dest[i] = ptr[i];
Dest[i] = '\0';
return true;
}
/* 拷貝一個字串 */
bool StrCopy(String Dest, String Src)
{
cout << "Copy Str ..." << endl;
int i;
for (i = 0; Src[i] != '\0' && i < MAXSIZE; i++)
Dest[i] = Src[i];
Dest[i] = '\0' ;
return true;
}
int StrLength(String Src)
{
int i = 0;
while (Src[i] != '\0')
i++;
return i;
}
bool StrEmpty(String Src)
{
if (StrLength(Src) == 0)
return true;
else
return false;
}
/* 若Str1>Str2,則返回值>0;若Str1=Str2,則返回值=0;若Str1<Str2,則返回值<0 */
int StrCompare(String Str1, String Str2)
{
int len1 = StrLength(Str1);
int len2 = StrLength(Str2);
for (int i = 0; i < len1 && i < len2; i++)
if (Str1[i] != Str2[i])
return Str1[i] - Str2[i];
return len1 - len2;
}
bool ClearString(String Src)
{
for (int i = 0; Src[i] != '\0'; i++)
Src[i] = '\0';
return true;
}
/* 用Dest返回Str1和Str2聯接而成的新串。若未截斷,則返回TRUE,否則FALSE */
bool StrConcate(String Dest, String Str1, String Str2)
{
cout << "Concate String ..." << endl;
if (StrLength(Str1) + StrLength(Str2) <= MAXSIZE)
{
/* 未截斷 */
int i, j;
for (i = 0; Str1[i] != '\0'; i++)
Dest[i] = Str1[i];
j = i;
for (i = 0; Str2[i] != '\0'; i++, j++)
Dest[j] = Str2[i];
Dest[j] = '\0';
return true;
}
else //截斷Str2
{
int i, j;
for (i = 0; Str1[i] != '\0'; i++)
Dest[i] = Str1[i];
j = i;
for (i = 0; Str2[i] != '\0' && j <= MAXSIZE - 1; i++, j++)
Dest[j] = Str2[i];
Dest[j] = '\0';
return false;
}
}
/* 用Sub返回串Src的第pos個字元起長度為len的子串。 */
bool SubString(String Sub, String Src, int pos, int len)
{
/*cout<<"Get SubString ..."<<endl;*/
if (pos < 1 || pos > StrLength(Src) ||
len < 0 || len > StrLength(Src) - pos + 1)
return false;
int i;
for (i = 0; i <= len - 1; i++)
Sub[i] = Src[i + pos - 1];
Sub[i] = '\0';
return true;
}
/* 返回子串Sub在主串Src中第pos個字元之後的位置。若不存在,則函式返回值為0。 */
int Index1(String Src, String Sub, int pos)
{
int len1 = StrLength(Src);
int len2 = StrLength(Sub);
int i = pos;
String sub;
if (pos > 0)
{
while (i <= len1 - len2 + 1)
{
SubString(sub, Src, i, len2);
/* 如果兩串相等 , 則返回i值 */
if (StrCompare(Sub, sub) == 0)
return i;
else/* 如果兩串不相等,前進位置 */
i++;
}
}
return 0;
}
int Index2(String Src, String Sub, int pos)
{
int i = pos - 1;
int j = 0;
int len1 = StrLength(Src);
int len2 = StrLength(Sub);
while (i <= len1 - 1 && j <= len2 - 1)
{
if (Src[i] == Sub[j])/* 兩字母相等則繼續 */
{
++i;
++j;
}
else
{
/* i退回到上次匹配首位的下一位 */
i = i - j + 1;
j = 0;/* j退回到子串Sub的首位 */
}
}
if (j == len2) //子串已經遍歷完畢
return i - len2 + 1;
else
return 0;
}
/* 在串Src的第pos個字元之前插入串In。完全插入返回TRUE,部分插入返回FALSE */
bool StrInsert(String Src, int pos, String In)
{
int i;
int len1 = StrLength(Src);
int len2 = StrLength(In);
if (pos < 1 || pos > len1 + 1)
return false;
if (len1 + len2 <= MAXSIZE)
{
/* 完全插入 */
for (i = len1; i >= pos - 1; i--)
Src[i + len2] = Src[i];
for (i = pos - 1; i < pos + len2 - 1; i++)
Src[i] = In[i - pos + 1];
if (pos == len1 + 1) //末尾插入,最後新增'\0'
Src[i] = '\0';
return true;
}
else
{
/* 部分插入,In截斷 */
for (i = MAXSIZE; i > pos; i--)
Src[i] = Src[pos + i - MAXSIZE];
for (i = 0; i < MAXSIZE - pos; i++)
Src[pos - 1 + i] = In[i];
return false;
}
}
/* 從串Src中刪除第pos個字元起長度為len的子串 */
bool StrDelete(String Src, int pos, int len)
{
int i;
if (pos < 1 || pos > StrLength(Src) - len + 1 || len < 0)
return false;
for (i = pos + len - 1; i <= StrLength(Src); i++)
Src[i - len] = Src[i];
return true;
}
/* 用Re替換主串Src中出現的所有與Sub相等的不重疊的子串 */
bool StrReplace(String Src, String Sub, String Re)
{
int i = 1;/* 從串Src的第一個字元起查詢串Sub */
if (StrEmpty(Sub))
return false;
do
{
i = Index1(Src, Sub, i);/* 結果i為從上一個i之後找到的子串Sub的位置 */
if (i)
{
StrDelete(Src, i, StrLength(Sub));/* 刪除該串Sub */
StrInsert(Src, i, Re); /* 在原串Sub的位置插入串Re */
i += StrLength(Re);/* 在插入的串Re後面繼續查詢串Sub */
}
}
while (i);
return true;
}
void StrPrint(String Src)
{
cout << "Print Str ..." << endl;
for (int i = 0; Src[i] != '\0'; i++)
cout << Src[i];
cout << endl;
}
int main(void)
{
String Str1;
StrAssign(Str1, "ILOVEYOU");
StrPrint(Str1);
String Str2;
StrCopy(Str2, Str1);
StrPrint(Str2);
if (!StrEmpty(Str1))
cout << "Str1's Length : " << StrLength(Str1) << endl;
String Str3;
StrAssign(Str3, "ILOVEyou");
if (StrCompare(Str1, Str3) > 0)
cout << "Str1 > Str3" << endl;
else if (StrCompare(Str1, Str3) == 0)
cout << "Str1 = Str3" << endl;
else
cout << "Str1 < Str3" << endl;
String Str4, Str5;
StrAssign(Str4, " HLZ");
StrConcate(Str5, Str1, Str4);
StrPrint(Str5);
String Str6;
cout << "Get SubString ..." << endl;
SubString(Str6, Str5, 1, 8);
StrPrint(Str6);
cout << "Index of (Str5, Str4) " << Index2(Str5, Str4, 2) << endl;
StrInsert(Str6, 9, " HLZ");
StrPrint(Str6);
StrInsert(Str6, 8, " HLZ");
StrPrint(Str6);
StrDelete(Str5, 2, 4);
StrPrint(Str5);
String Str7, Str8;
StrAssign(Str7, "ILOVEJDWSOVEDSOVEde");
StrAssign(Str8, "OVE");
StrReplace(Str7, Str8, "ove");
StrPrint(Str7);
return 0;
}
輸出為:
對於字串的鏈式儲存結構來說,一個節點存放多少個字元才合適顯得很重要,這會直接影響字串處理的效率,需要根據實際情況做出選擇。但字串的鏈式儲存結構除了在連線串與串操作時有一定方便之外,總的來說不如順序儲存靈活,效能也不如順序儲存結構好。
相關推薦
資料結構:字串(堆)——基本操作
資料結構的重要行不言而喻,簡單介紹我在這部分遇到的一些問題,希望對大家有少許幫助。 首先實現的多個操作: 程式碼: #include<stdio.h> #include<stdlib.h> #include<string.h> #defi
資料結構:字串的基本操作
字串(string)是由0個或多個字元組成的有限序列。一般使用順序儲存結構,末尾以’\0’表示結束,但不計入字串的長度。 示例程式:(改編自《大話資料結構》 #include<iostream> using namespace std;
案例3.2:括號匹配的檢驗(c++實現/資料結構/棧的基本操作)
#include<iostream> #define MaxSize 100 #define OK 1 #define ERROR 0 using namespace std; typedef char ElemType; typedef int Status
資料結構棧的基本操作
#include<iostream> #define MAXSIZE 100 #define OVERFLOW -1 #define OK 1 #define ERROR 0 using namespace std; typedef int SElemType
資料結構串的基本操作--賦值,列印,連線
//#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string> #include<string.h> using namespac
資料結構 圖的基本操作實現
實驗題目: 圖的基本操作實現 實驗環境: Visual C++ 6.0 實驗目的:掌握圖的鄰接矩陣和鄰接表兩個儲存結構及表示。 掌握圖的DFS和BFS兩種遍歷演算法。 理解並
資料結構-鏈佇列基本操作
都是些基本操作,有興趣的可以看看。 1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef struct QNode { 4 int data; 5 struct QNode *next; 6 }QNod
演算法與資料結構-棧的基本操作C語言實現
序言 複習棧的基本操作及其C語言實現,主要以鏈式棧為例。 本文將介紹棧的以下基本操作: 棧的建立(順序棧和鏈式棧) 棧的初始化 棧遍歷 棧清空/銷燬 判斷棧是否為空 求棧的長度 返回並刪除棧頂元素 1. 棧建立 - 順序棧和鏈式棧 //順序棧的
資料結構-串-StringBuffer基本操作(JAVA)
StringBuffer和String類的區別是StringBuffer中的陣列有緩衝,所以不需要每次進行插入操作都重新申請陣列,提高了空間利用效率。這裡實現了一些StringBuffer的基本操作(幾個構造方法,查入和刪除操作)。 public class MyStrin
資料結構:字串
二.字串定義:若干字元組成的序列c++/c與Java中字串的對比:c/c++中每個字串都是以‘\0‘作為結尾;Java中卻不是這樣的,Java中的一切都是物件,物件有長度,編譯器可以確定輸出的字元個數。題目:請實現一個函式,把字串中的每一個空格替換成‘%20‘,例如,輸入為"
資料結構——棧的基本操作(二進位制轉十進位制例項—c語言程式碼)
棧棧是一種重要的線性結構。棧必須通過線性表或者連結串列來實現,順序表點選開啟連結和連結串列點選開啟連結既可以向之前介紹的那樣獨立存在,同時它們也是一些特殊的資料結構(棧,佇列)的實現基礎。定義:棧是一個先進後出的線性表,只要求在表尾進行插入和刪除等操作,這是棧相對於連結串列和
資料結構—順序表基本操作(c語言程式碼)
順序表計算機內部儲存一張線性表是用一組連續地址記憶體單元,這種儲存結構即為順序儲存結構,這種結構下的線性表叫順序表。順序表有兩種定義方法: 1.靜態定義
演算法與資料結構-佇列的基本操作C語言實現
序言 佇列有順序佇列和鏈式佇列,順序佇列通過陣列方式來實現,鏈式佇列通過連結串列方式來實現。 陣列方式實現便於資料訪問(大小和空間確定),連結串列方式實現便於資料操作(插入和刪除靈活)。 這裡介紹
資料結構:順序表的基本操作和還原
實現順序表的基本操作 三、實驗內容 定義順序表(可用結構體實現)、所需要的符號常量以及在該順序表上所進行的操作(用函式實現)初始化、插入新元素、刪除指定元素、查詢(返回指定元素位置)、檢索指定位置的元素。 要求:1、在主函式中呼叫各個函式實現相應操作,首
資料結構:實驗四棧和佇列的基本操作實現及其應用
一、實驗目的 1,熟練掌棧和佇列的結構特點,掌握棧和佇列的順序儲存和鏈式儲存結構和實現。 2,學會使用棧和佇列解決實際問題。 二、實驗內容 1,自己確定結點的具體資料型別和問題規模: 分別建立一個順序棧和鏈棧,實現棧的壓棧和出棧操作。 分別建立一個順
基本資料結構――堆的基本概念及其操作
轉載自:https://www.cnblogs.com/JVxie/p/4859889.html,同時感謝大佬的分析 在我剛聽到堆這個名詞的時候,我認為它是一堆東西的集合 但其實吧它是利用
資料結構:基本資料概念
嚶嚶嚶,不知道更新啥了,就更新一下我複習的東西吧,感覺還挺有用的。 1,資料結構+演算法=程式設計 2,資料結構:資料元素之間存在的關係。 3,演算法:是一個有窮規則的集合,其規則確定一個解決某一特定型別問題的操作序列。 4,資料元素:表示一個事務的一組資料,是資料的基本單位。
Java資料結構:二叉排序樹的刪除操作
嚶嚶嚶,今天補回昨天沒有寫的部落格。 二叉排序樹的刪除操作比較簡單,但是思想很全面,因此本人就寫一篇部落格紀念一下。 思想:四種類型也可以是三種 1,刪除結點p的度為2,即有左右子樹。 此時有兩種方法,第一種將結點的左子樹在中根遍歷下的最後一個結點放到p的位置。第二種是將p結點
Python學習筆記 - 基本資料結構:元組,列表,字典,集合
序列 序列是具有先後關係的一組元素 序列是一維元素向量,元素型別可以不同 序列是一個基類型別,字串、元組、列表都屬於序列。 序列處理函式及方法主要有: # 判斷某一元素x是否在序列s中 x in s x not in s # 連線兩個序列 s + t # 將序列s複製n
python 基礎資料結構之字串操作
#切割部分s = 'I love you more than i can say' # 切割字串 # sep:指定按照什麼進行切割,預設按照空格切割 # maxsplit:指定最大切割次數,預設不限制次數 # ret = s.split(sep='abc', maxsplit=1) # 從右邊進行切割