1. 程式人生 > >串知識點詳解(資料結構,嚴蔚敏版)

串知識點詳解(資料結構,嚴蔚敏版)

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