串知識點詳解(資料結構,嚴蔚敏版)
1.堆分配儲存表示(也是一種順序表)
typedef struct{
char *ch;
int length;
}HString;
2.串操作函式
//初始化一個串 void InitalStr(HString &T); //生成一個其值等於串常量chars的串T. void StrAssign(HString &T, char *chars); //返回串的長度 int StrLength(HString &T); //比較串大小,從第一個開始比較,若T>S返回>0,若S=T 返回0;若T<S返回<0 int StrCompare(HString &T, HString &S); //將T清空為空串 int ClearString(HString &T); //用T返回S1和S2連線的新串 void Concat(HString &T, HString &S1, HString &S2); //用Sub返回串T的第Pos個字元,長度為len的子串 int SubString(HString &Sub, HString &T, int pos, int len);
3.函式實現
#include<stdio.h> #include<stdlib.h> #include"HStringOp.h" //初始化一個串 void InitalStr(HString &T){ T.ch = NULL; T.length = 0; } //生成一個其值等於串常量chars的串T. void StrAssign(HString &T,char *chars){ int i = 0,j=0; char *c; if (T.ch)free(T.ch); for (i = 0, c = chars; *c; ++i, ++c); if (!i) { T.ch = NULL; T.length = 0; } else { if (!(T.ch = (char *)malloc(i*sizeof(char))))exit; while (j<i) { T.ch[j] = chars[j]; j++; } T.length = i; } } //返回串的長度 int StrLength(HString &T){ return T.length; } //比較串大小,從第一個開始比較,若T>S返回>0,若S=T 返回0;若T<S返回<0 int StrCompare(HString &T, HString &S){ int i = 0; for ( i = 0; i < T.length&&i<S.length; i++) { if (T.ch[i]!=S.ch[i]) { return T.ch[i] - S.ch[i]; } } return T.length - S.length; } //將T清空為空串 int ClearString(HString &T){ if (T.length == 0)return 1; free(T.ch); T.ch = NULL; T.length = 0; return 1; } //用T返回S1和S2連線的新串 void Concat(HString &T,HString &S1,HString &S2){ if (T.ch)free(T.ch); if (!(T.ch=(char *)malloc((S1.length+S2.length)*sizeof(char))))exit; for (int i = 0; i < S1.length; i++) { T.ch[i] = S1.ch[i]; } for (int i = S1.length; i < S1.length+S2.length; i++) { T.ch[i] = S2.ch[i-S1.length]; } T.length = S1.length + S2.length; } //用Sub返回串T的第Pos個字元,長度為len的子串 int SubString(HString &Sub,HString &T,int pos,int len){ if (!T.length)return 0; if (pos > T.length)return 0; if (Sub.ch)free(Sub.ch); if (T.length<(pos+len-1))Sub.length = T.length - pos + 1; else Sub.length = len; Sub.ch = (char *)malloc(Sub.length*sizeof(char)); for (int i = 0; i < Sub.length; i++) { Sub.ch[i] = T.ch[i + pos-1]; } return 1; }
4.子串位置定位一般演算法,返回第pos個字元後子串的位置
int pos_substr(HString &F,HString &S,int pos){ int i = pos, j = 0; int Flength = StrLength(F); int Slength = StrLength(S); if (Slength+pos>Flength) { return 0; } while (i<Flength&&j<Slength) { if (F.ch[i]==S.ch[j]) { ++i; ++j; }else { i=i-j+1; j = 0; } } if (j >=Slength)return i+1 - Slength; else return 0; }
5.KMP演算法
(1)求next函式
//next函式求值
void get_next(HString &S,int *p){
int i = 0, j = 0;
i = 0; *p = 0;
while (i<S.length-1) //書中T[0]存放的是字串的長度,我們這裡T[0]也屬於字串的內容
{
/*
實際上求next演算法也是一個匹配的過程
當ch[i]==ch[j-1]時說明,主串第i+1個(我們這裡字串從0開始)之前有j個字元與子串匹配。則p[i+1]=j;同時繼續比較ch[i+1]=ch[j]
當ch[i]!=ch[j-1]時說明,主串第i個字元與子串第j-1個字元適配,這時候需要獲取子串的第j-1個next個值,再與主串進行比較
這裡表示next值的指標也是從0標號開始,與書上不同。
*/
if (j==0||S.ch[i]==S.ch[j-1]){
i++; j++;
p[i] = j;
}
else
{
j = p[j-1];
}
}
}
求next函式改進演算法
//KMP模式匹配改進演算法
void get_nextval(HString &S, int *p){
int i = 0, j = 0;
i = 0; *p = 0;
while (i < S.length - 1) //書中T[0]存放的是字串的長度,我們這裡T[0]也屬於字串的內容
{
if (j == 0 || S.ch[i] == S.ch[j - 1]){
i++; j++;
if (S.ch[i]!=S.ch[j-1])
{
p[i] = j;
}
else{
p[i] = p[j-1];
}
}
else
{
j = p[j - 1];
}
}
}
(2)KMP實現定子串位置函式
//KMP模式匹配演算法
int Index_KMP(HString T,HString S,int pos,int *p){
int i = pos, j = 0;
while (i<S.length&&j<T.length)
{
if (S.ch[i]==T.ch[j])
{
i++; j++;
}
else
{
j = p[j];
if (j==0)
{
i++;
}
else
{
j--;
}
}
}
if (j>=T.length)
{
return i - T.length+1;
}
else
{
return 0;
}
}
相關推薦
串知識點詳解(資料結構,嚴蔚敏版)
1.堆分配儲存表示(也是一種順序表) typedef struct{ char *ch; int length; }HString; 2.串操作函式 //初始化一個串 void InitalStr(HString &T); //生成一個其值等於串常量chars
ping問題詳解(請求超時,無法訪問目標主機)
我們有時需要進行遠端或者共享對方資料庫的時候,會ping一下對方電腦,時候能夠ping通,時候能夠進行資料的傳輸。有時會出現ping請求超時,那麼遇到這個問題該怎麼解決? 我們首要解決的是看他自己是否能ping通自己的,我們就在他的電腦中輸入ping,發現是可以
《資料結構》嚴蔚敏串的ADT實現 演算法4.1
這個沒有藉助C語言的庫函式,而是自己寫了一下字串操作函式. 測試用例有點水,將就著看吧。。。 附上c語言字串操作函式 // strcpy(p, p1) 複製字串 // strncpy(p, p1, n) 複製指定長度字串 // strcat(p, p1) 附加字串 // strnc
資料結構》嚴蔚敏 串的ADT實現 用堆串儲存 演算法4.4
跟前面的線性儲存是一個道理的,本質上還是順序儲存,只不過用了堆來動態分配,使串的長度不受限制,更加靈活 借用大佬一張圖: 4_4.h #ifndef _4_4_H #define _4_4_H #include<stdio.h> #include<stdlib
資料結構演算法實現 (嚴蔚敏版)目錄
資料結構演算法實現(嚴蔚敏版配套實現程式)目錄: 第1章 緒論1.1 什麼是資料結構1.2 基本概念和術語1.3 抽象資料型別的表現與實現1.4 演算法和演算法分析第2章 線性表2.1 線性表的型別定義2.2 線性表的順序表示和實現2.3 線性表的鏈式表示和實現2.4 一元
最短路徑---Dijkstra迪杰特斯拉演算法---《資料結構》嚴蔚敏
// exam1.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <iostream> #include <stack> using namespace std; #define MAXV
《資料結構》嚴蔚敏 用棧實現迷宮求解問題
轉載:https://blog.csdn.net/Vit_rose/article/details/52781116 膜大佬~ 其實自己就是懶,太懶了,不想動手寫,有畏難情緒,這個毛病得改鴨 思路:利用棧窮舉路徑,從而來得到問題的解答 注意:當前路徑可通,指未曾走到過的通道塊(即不能是已經壓
《資料結構》嚴蔚敏 離散時間模擬——銀行排隊 演算法3_6 - 3_7
這個是借鑑了一下別人的程式碼的。原文:https://www.cnblogs.com/kangjianwei101/p/5225738.html(膜大佬) 這個問題綜合性很高,把佇列和連結串列的知識都照顧到了誒。 學習一下~ 還是先放截圖吧 3.6.h #ifnde
《資料結構》嚴蔚敏 順序儲存實現迴圈佇列 演算法3_4_3
我第一次實現的時候竟然是用連結串列實現的。。。哎,這種zz的事,就莫再提了,轉載文章:https://blog.csdn.net/Vit_rose/article/details/52781124 其實和前面順序棧差不多,但是就是在判斷指標的下一個位置的時候 q->rear = (
《資料結構》嚴蔚敏 鏈式儲存實現佇列 演算法3_4_2
這個用連結串列代替陣列來實現佇列 這個程式碼書寫的時候注意ClearQueue(Link_Queue *q) 和DestroyQueue(Link_Queue *q)這兩個函式 前者在寫的時候:要注意第一步是先將rear指標挪到指向佇列首元素的位置,然後一舉將剩下的元素一併釋放,接著再釋
《資料結構》嚴蔚敏 用棧實現行編輯程式
參考文章:https://blog.csdn.net/Vit_rose/article/details/52781086 核心程式碼:void LineEdit(SqStack L) //order stack //接受使用者輸入在緩衝區中,使用者發現輸入錯誤的時候,可以補一個
《資料結構》嚴蔚敏 用棧實現括號匹配檢驗
思路:將符合要求的符號"[“和”(“新增到棧中,然後將每一次輸入的”]“和”)"與棧頂元素利用ascii碼值來進行比較,如果匹配則將棧中壓入的元素彈出,否則繼續匹配下一個。當輸入結束符“#”時,若棧為空,則匹配成功,否則,匹配失敗 核心程式碼: int match(char p,char
《資料結構》嚴蔚敏 用棧實現進位制轉換
基本思想很簡單 原數:N N = (N div d) X d + N mod d //Order Stack //apply of stack --- conversion of number systems #include<stdio.h> #include<s
《資料結構》嚴蔚敏 3.1 棧
It’s enough easy,so I complete it smoothly. Well,This morning I meet a handsome and nice Philadelphia boy,May be It’s also a catalyst~ the scree
《資料結構》嚴蔚敏 演算法2.22
用連結串列實現兩個多項式相加 #include<stdio.h> #include<string.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ER
《資料結構》嚴蔚敏 演算法2.1程式碼實現
題目要求實現: A= AUB 參考部落格:https://blog.csdn.net/sunshine_rebrith/article/details/78310545 用線性表的順序結構來表示(陣列實現) #include<stdio.h> #include<st
《資料結構》嚴蔚敏 順序儲存實現佇列 演算法3_4_1
這個的實現和前面的棧大同小異,就不多敘述了 // queue //除了這種還有雙端佇列 #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define INIT_SIZ
《資料結構》嚴蔚敏 用棧實現遞迴來解決hanoi問題
感覺書上對遞迴操作的棧理解的挺好的,有需要的可以去找一下書看一下 //hanoi problem #include<stdio.h> #include<stdlib.h> #include<string.h> int times = 1;
《資料結構》嚴蔚敏 演算法3.4 用棧實現表示式求值
emmmm 我又偷懶了,看了一下書上的演算法,總感覺不是很好的演算法,我覺得可以類比前面的符號匹配來進行表示式求值,但是今天有點不想寫了,先copy一個答案吧 原文連結:https://blog.csdn.net/hello_sheep/article/details/75635777
Polynomial 一元多項式的表示及相加 (線性連結串列實現 嚴蔚敏版)
1、貼程式碼: #include <iostream> #include <cstdio> using namespace std; struct Node { double coef; int expn; Node *next; }; v