C#数据结构-串
                            
                            
                            串讓我們聯想到了羊肉串、糖葫蘆,里面是由一個個的山楂串起來,所以串的定義就是:由零個或多個字符組成的有限序列。其中里面的元素個數叫做串的長度,零個字符組成的串叫做空串。通常使用雙引號""表示一個串。
這里我們有一些字符串a="123abc";b="123",c="ab"。這里我們把a字符串稱作主串,b和c是包含在a里面的子串
我們這里實現串用兩種方式:
順序串:
/// <summary>/// 順序串/// </summary>class LineStringClass{const int maxSize = 100;public char[] data;public int length;public LineStringClass(){data = new char[maxSize];length = 0;}#region 生成串public void StrAssign(string str){int len = 0;for (; len < str.Length; len++){data[len] = str[len];}length = len;}#endregion#region 復制一個串public void StrCopy(LineStringClass str){for (int len = 0; len < str.length; len++){data[len] = str.data[len];}length = str.length;}#endregion#region 串的長度public int StrLength(){return length;}#endregion#region 串連接public LineStringClass Concat(LineStringClass str){//創建一個新串LineStringClass newStr = new LineStringClass();newStr.length = length + str.length;//先把現有的串添加到新串for (int i = 0; i < length; i++){newStr.data[i] = data[i];}//再把需要連接的串添加到新串for (int len = 0; len < str.length; len++){newStr.data[length + len] = str.data[len];}return newStr;}#endregion#region 求子串,從starChar開始獲取到接下來的item個數public LineStringClass SubStr(int starChar, int item){LineStringClass newStr = new LineStringClass();//判斷截取的串是否正常if (starChar < 0 || item > 0 || starChar + item - 1 > length){return newStr;}newStr.length = item - 1;for (int i = 0; i < item - 1; i++){newStr.data[i] = data[starChar + i];}return newStr;}#endregion#region 插入串,從starChar開始插入字符串strpublic LineStringClass InsertStr(int starChar, LineStringClass str){LineStringClass newStr = new LineStringClass();//判斷插入地址是否正常if (starChar > length || starChar < 0){return newStr;}newStr.length = length + str.length;//新串插入位置int len = 0;//添加舊串for (int i = 0; i < length; i++){if (i != starChar){//舊串插入newStr.data[len] = data[i];len++;}else{//新增串插入for (int j = 0; j < str.length; j++){newStr.data[len] = str.data[j];len++;}//舊串連接點插入newStr.data[len] = data[i];len++;}}return newStr;}#endregion#region 刪除串,從starChar開始連續刪除item個字符public LineStringClass DeleteStr(int starChar, int item){LineStringClass newStr = new LineStringClass();//判斷刪除位置是否正常if (starChar < 0 || item > 0 || starChar + item - 1 > length){return newStr;}int len = 0;newStr.length = length - item;for (int i = 0; i < length; i++){if (i != starChar){newStr.data[len] = data[i];len++;}else{i += item;if (i <= length){newStr.data[len] = data[i];len++;}}}return newStr;}#endregion#region 替換,從starChar開始連續的item個字符被str替換public LineStringClass RepStr(int starChar, int item, LineStringClass str){LineStringClass newStr = new LineStringClass();//判斷刪除位置是否正常if (starChar < 0 || item > 0 || starChar + item - 1 > length){return newStr;}newStr.length = length - str.length;int len = 0;for (int i = 0; i < length; i++){if (i != starChar){//添加主串newStr.data[len] = data[i];len++;}else{//添加子串for (int j = 0; j < length; j++){newStr.data[len] = str.data[j];len++;}i += item;if (i <= length){newStr.data[len] = data[i];len++;}}}return newStr;}#endregion#region 輸出當前串public string DispStr(){string newStr = string.Empty;for (int i = 0; i < length; i++){newStr += data[i];}//StringBuilder sb = new StringBuilder();//for (int i = 0; i < length; i++)//{// sb.Append(data[i]);//}//return sb.ToString();return newStr;}#endregion} 鏈串:
/// <summary>/// 鏈串存儲結構/// </summary>class LinkeStringData{public char data;public LinkeStringData next;}/// <summary>/// 鏈串/// </summary>class LinkeStringClass{public LinkeStringData head = new LinkeStringData();public LinkeStringClass(){head.next = null;}#region 建立鏈串public void StrAssign(string str){int i;LinkeStringData newLinkeStr = head;for (i = 0; i < str.Length; i++){LinkeStringData pLinkeStr = new LinkeStringData();pLinkeStr.data = str[i];newLinkeStr.next = pLinkeStr;newLinkeStr = pLinkeStr;}newLinkeStr.next = null;}#endregion#region 復制一個串public void StrCopy(LinkeStringClass str){LinkeStringData strNext = str.head.next, newLinkeStr;newLinkeStr = head;while (strNext != null){LinkeStringData q = new LinkeStringData();q.data = strNext.data;newLinkeStr.next = q;newLinkeStr = q;strNext = strNext.next;}newLinkeStr.next = null;}#endregion#region 串的長度public int StrLength(){int len = 0;LinkeStringData pLinkeString = head.next;while (pLinkeString != null){len++;pLinkeString = pLinkeString.next;}return len;}#endregion#region 串連接,采用尾插法public LinkeStringClass Concat(LinkeStringClass str){LinkeStringClass newStr = new LinkeStringClass();LinkeStringData pdata = head.next, q, r;r = newStr.head;while (pdata != null){q = new LinkeStringData();q.data = pdata.data;r.next = q;r = q;pdata = pdata.next;}pdata = str.head.next;while (pdata != null){q = new LinkeStringData();q.data = pdata.data;r.next = q;r = q;pdata = pdata.next;}r.next = null;return newStr;}#endregion#region 求子串,從starChar開始獲取到接下來的item個數public LinkeStringClass SubStr(int starChar, int item){LinkeStringClass newStr = new LinkeStringClass();LinkeStringData pLinkeStr = head.next, q, r;int len = 0;if (starChar < 0 || item < 1 || starChar + item - 1 > StrLength()){return newStr;}r = newStr.head;while (pLinkeStr != null){if (len == starChar){for (int i = 0; i < item; i++){q = new LinkeStringData();q.data = pLinkeStr.data;r.next = q;r = q;pLinkeStr = pLinkeStr.next;}r.next = null;break;}pLinkeStr = pLinkeStr.next;len++;}return newStr;}#endregion#region 插入串,從starChar開始插入字符串strpublic LinkeStringClass InsertStr(int starChar, LinkeStringClass str){LinkeStringClass newStr = new LinkeStringClass();int len = 0;LinkeStringData pLinkeStr = head.next, pl = str.head.next, q, r;if (starChar < 0 || starChar > StrLength()){return newStr;}r = newStr.head;while (pLinkeStr != null){if (len == starChar){//插入新增串for (int i = 0; i < str.StrLength(); i++){q = new LinkeStringData();q.data = pl.data;r.next = q;r = q;pl = pl.next;}}q = new LinkeStringData();q.data = pLinkeStr.data;r.next = q;r = q;pLinkeStr = pLinkeStr.next;len++;}return newStr;}#endregion#region 刪除串,從starChar開始連續刪除item個字符public LinkeStringClass DeleteStr(int starChar, int item){LinkeStringClass newStr = new LinkeStringClass();int len = 0;LinkeStringData pLinkeStr = head.next, q, r;if (starChar < 0 || starChar > StrLength()){return newStr;}r = newStr.head;while (pLinkeStr != null){if (len < starChar || len >= starChar + item){q = new LinkeStringData();q.data = pLinkeStr.data;r.next = q;r = q;}pLinkeStr = pLinkeStr.next;len++;}return newStr;}#endregion#region 替換,從starChar開始連續的item個字符被str替換public LinkeStringClass RepStr(int starChar, int item, LinkeStringClass str){LinkeStringClass newStr = new LinkeStringClass();int len = 0;LinkeStringData pLinkeStr = head.next, pl = str.head.next, q, r;if (starChar < 0 || starChar > StrLength()){return newStr;}r = newStr.head;while (pLinkeStr != null){//添加串if (len < starChar || len >= starChar + item){q = new LinkeStringData();q.data = pLinkeStr.data;r.next = q;r = q;}else{//新串添加while (pl != null){q = new LinkeStringData();q.data = pl.data;r.next = q;r = q;pl = pl.next;}//舊串替換位置處理while (len<starChar+item-1){pLinkeStr = pLinkeStr.next;len++;}}pLinkeStr = pLinkeStr.next;len++;}return newStr;}#endregion#region 輸出當前串public string DispStr(){//這里也可以使用StringBuilderstring newStr = string.Empty;LinkeStringData pLinkeStr = head.next;while (pLinkeStr!=null){newStr += pLinkeStr.data;pLinkeStr = pLinkeStr.next;}return newStr;}#endregion} 總結一下:這里串的操作在平常開發用得比較多,所以搞清楚c#內部封裝結構,有利于我們開發,當然,在此之前我對順序串和鏈串的添加做了一部分的優化,可能沒有使用到多個循環一步一步的去操作字符串,所以讀者閱讀代碼的時候可以先考慮以下最優的方案。最后希望大家留言給我一些建議
                            
                        
                        
                        /// <summary>/// 順序串/// </summary>class LineStringClass{const int maxSize = 100;public char[] data;public int length;public LineStringClass(){data = new char[maxSize];length = 0;}#region 生成串public void StrAssign(string str){int len = 0;for (; len < str.Length; len++){data[len] = str[len];}length = len;}#endregion#region 復制一個串public void StrCopy(LineStringClass str){for (int len = 0; len < str.length; len++){data[len] = str.data[len];}length = str.length;}#endregion#region 串的長度public int StrLength(){return length;}#endregion#region 串連接public LineStringClass Concat(LineStringClass str){//創建一個新串LineStringClass newStr = new LineStringClass();newStr.length = length + str.length;//先把現有的串添加到新串for (int i = 0; i < length; i++){newStr.data[i] = data[i];}//再把需要連接的串添加到新串for (int len = 0; len < str.length; len++){newStr.data[length + len] = str.data[len];}return newStr;}#endregion#region 求子串,從starChar開始獲取到接下來的item個數public LineStringClass SubStr(int starChar, int item){LineStringClass newStr = new LineStringClass();//判斷截取的串是否正常if (starChar < 0 || item > 0 || starChar + item - 1 > length){return newStr;}newStr.length = item - 1;for (int i = 0; i < item - 1; i++){newStr.data[i] = data[starChar + i];}return newStr;}#endregion#region 插入串,從starChar開始插入字符串strpublic LineStringClass InsertStr(int starChar, LineStringClass str){LineStringClass newStr = new LineStringClass();//判斷插入地址是否正常if (starChar > length || starChar < 0){return newStr;}newStr.length = length + str.length;//新串插入位置int len = 0;//添加舊串for (int i = 0; i < length; i++){if (i != starChar){//舊串插入newStr.data[len] = data[i];len++;}else{//新增串插入for (int j = 0; j < str.length; j++){newStr.data[len] = str.data[j];len++;}//舊串連接點插入newStr.data[len] = data[i];len++;}}return newStr;}#endregion#region 刪除串,從starChar開始連續刪除item個字符public LineStringClass DeleteStr(int starChar, int item){LineStringClass newStr = new LineStringClass();//判斷刪除位置是否正常if (starChar < 0 || item > 0 || starChar + item - 1 > length){return newStr;}int len = 0;newStr.length = length - item;for (int i = 0; i < length; i++){if (i != starChar){newStr.data[len] = data[i];len++;}else{i += item;if (i <= length){newStr.data[len] = data[i];len++;}}}return newStr;}#endregion#region 替換,從starChar開始連續的item個字符被str替換public LineStringClass RepStr(int starChar, int item, LineStringClass str){LineStringClass newStr = new LineStringClass();//判斷刪除位置是否正常if (starChar < 0 || item > 0 || starChar + item - 1 > length){return newStr;}newStr.length = length - str.length;int len = 0;for (int i = 0; i < length; i++){if (i != starChar){//添加主串newStr.data[len] = data[i];len++;}else{//添加子串for (int j = 0; j < length; j++){newStr.data[len] = str.data[j];len++;}i += item;if (i <= length){newStr.data[len] = data[i];len++;}}}return newStr;}#endregion#region 輸出當前串public string DispStr(){string newStr = string.Empty;for (int i = 0; i < length; i++){newStr += data[i];}//StringBuilder sb = new StringBuilder();//for (int i = 0; i < length; i++)//{// sb.Append(data[i]);//}//return sb.ToString();return newStr;}#endregion} 鏈串:
/// <summary>/// 鏈串存儲結構/// </summary>class LinkeStringData{public char data;public LinkeStringData next;}/// <summary>/// 鏈串/// </summary>class LinkeStringClass{public LinkeStringData head = new LinkeStringData();public LinkeStringClass(){head.next = null;}#region 建立鏈串public void StrAssign(string str){int i;LinkeStringData newLinkeStr = head;for (i = 0; i < str.Length; i++){LinkeStringData pLinkeStr = new LinkeStringData();pLinkeStr.data = str[i];newLinkeStr.next = pLinkeStr;newLinkeStr = pLinkeStr;}newLinkeStr.next = null;}#endregion#region 復制一個串public void StrCopy(LinkeStringClass str){LinkeStringData strNext = str.head.next, newLinkeStr;newLinkeStr = head;while (strNext != null){LinkeStringData q = new LinkeStringData();q.data = strNext.data;newLinkeStr.next = q;newLinkeStr = q;strNext = strNext.next;}newLinkeStr.next = null;}#endregion#region 串的長度public int StrLength(){int len = 0;LinkeStringData pLinkeString = head.next;while (pLinkeString != null){len++;pLinkeString = pLinkeString.next;}return len;}#endregion#region 串連接,采用尾插法public LinkeStringClass Concat(LinkeStringClass str){LinkeStringClass newStr = new LinkeStringClass();LinkeStringData pdata = head.next, q, r;r = newStr.head;while (pdata != null){q = new LinkeStringData();q.data = pdata.data;r.next = q;r = q;pdata = pdata.next;}pdata = str.head.next;while (pdata != null){q = new LinkeStringData();q.data = pdata.data;r.next = q;r = q;pdata = pdata.next;}r.next = null;return newStr;}#endregion#region 求子串,從starChar開始獲取到接下來的item個數public LinkeStringClass SubStr(int starChar, int item){LinkeStringClass newStr = new LinkeStringClass();LinkeStringData pLinkeStr = head.next, q, r;int len = 0;if (starChar < 0 || item < 1 || starChar + item - 1 > StrLength()){return newStr;}r = newStr.head;while (pLinkeStr != null){if (len == starChar){for (int i = 0; i < item; i++){q = new LinkeStringData();q.data = pLinkeStr.data;r.next = q;r = q;pLinkeStr = pLinkeStr.next;}r.next = null;break;}pLinkeStr = pLinkeStr.next;len++;}return newStr;}#endregion#region 插入串,從starChar開始插入字符串strpublic LinkeStringClass InsertStr(int starChar, LinkeStringClass str){LinkeStringClass newStr = new LinkeStringClass();int len = 0;LinkeStringData pLinkeStr = head.next, pl = str.head.next, q, r;if (starChar < 0 || starChar > StrLength()){return newStr;}r = newStr.head;while (pLinkeStr != null){if (len == starChar){//插入新增串for (int i = 0; i < str.StrLength(); i++){q = new LinkeStringData();q.data = pl.data;r.next = q;r = q;pl = pl.next;}}q = new LinkeStringData();q.data = pLinkeStr.data;r.next = q;r = q;pLinkeStr = pLinkeStr.next;len++;}return newStr;}#endregion#region 刪除串,從starChar開始連續刪除item個字符public LinkeStringClass DeleteStr(int starChar, int item){LinkeStringClass newStr = new LinkeStringClass();int len = 0;LinkeStringData pLinkeStr = head.next, q, r;if (starChar < 0 || starChar > StrLength()){return newStr;}r = newStr.head;while (pLinkeStr != null){if (len < starChar || len >= starChar + item){q = new LinkeStringData();q.data = pLinkeStr.data;r.next = q;r = q;}pLinkeStr = pLinkeStr.next;len++;}return newStr;}#endregion#region 替換,從starChar開始連續的item個字符被str替換public LinkeStringClass RepStr(int starChar, int item, LinkeStringClass str){LinkeStringClass newStr = new LinkeStringClass();int len = 0;LinkeStringData pLinkeStr = head.next, pl = str.head.next, q, r;if (starChar < 0 || starChar > StrLength()){return newStr;}r = newStr.head;while (pLinkeStr != null){//添加串if (len < starChar || len >= starChar + item){q = new LinkeStringData();q.data = pLinkeStr.data;r.next = q;r = q;}else{//新串添加while (pl != null){q = new LinkeStringData();q.data = pl.data;r.next = q;r = q;pl = pl.next;}//舊串替換位置處理while (len<starChar+item-1){pLinkeStr = pLinkeStr.next;len++;}}pLinkeStr = pLinkeStr.next;len++;}return newStr;}#endregion#region 輸出當前串public string DispStr(){//這里也可以使用StringBuilderstring newStr = string.Empty;LinkeStringData pLinkeStr = head.next;while (pLinkeStr!=null){newStr += pLinkeStr.data;pLinkeStr = pLinkeStr.next;}return newStr;}#endregion} 總結一下:這里串的操作在平常開發用得比較多,所以搞清楚c#內部封裝結構,有利于我們開發,當然,在此之前我對順序串和鏈串的添加做了一部分的優化,可能沒有使用到多個循環一步一步的去操作字符串,所以讀者閱讀代碼的時候可以先考慮以下最優的方案。最后希望大家留言給我一些建議
總結
 
                            
                        - 上一篇: 原生JS实现Canvas时钟
- 下一篇: 绑定方法与非绑定方法
