資料結構實驗四 串(模式匹配,刪除子串)
實驗三串
一、 實驗目的
1. 熟悉串的順序儲存結構
2. 掌握串的基本運算及應用
二、 實驗內容
1.模式匹配:串採用順序儲存結構,編寫樸素模式匹配演算法,查詢在串中是否存在給定的子串。
//seqstring.h
//本標頭檔案為實驗四第一問串的順序儲存
#include<iostream>
using namespace std;
const int size=100;
class seqstring //串採用順序儲存結構
{
private:
char str[size];
int len;
public:
seqstring(){len=0 ;} //無引數建構函式
seqstring(char a[],int n); //有引數建構函式
~seqstring(){} //解構函式
void Delete(int i); //刪除第i個位置的元素
void printstring(); //顯示串的內容
char get(int i);//得到位置i的元素
};
seqstring::seqstring(char a[],int n)//有引數建構函式
{
for(int i=0;i<n;i++)
str[i]=a[i];
str[n]='\0' ;
len=n;
}
void seqstring::printstring() //顯示串的內容
{
for(int i=0;i<len;i++)
cout<<str[i];
cout<<endl;
}
void seqstring::Delete(int i)//刪除第i個位置的元素
{
int j=0;
for(j=i;j<len;j++)
{
str[j-1]=str[j];
}
len--;
}
char seqstring::get(int i)//得到位置i的元素
{
return str[i];
}
//main.cpp
#include<iostream>
#include"seqstring.h"
using namespace std;
int BF(seqstring s,seqstring t)//樸素模式匹配演算法
{
int i,j;
i=0;j=0;
while((s.get(i)!='\0')&&(t.get(j)!='\0'))
{
if(s.get(i)==t.get(j))
{
i++;j++;
}
else
{
i=i-j+1;j=0;
}
}
if(t.get(j)=='\0')return(i-j+1); //存在查詢的字串返回位置
else return 0; //不存在返回0
}
int main()
{
char S[]="aaaabc"; //測試aaaabc中是否存在abc
char T[]="abc";
seqstring s(S,6);
seqstring t(T,3);
int a;
a=BF(s,t);
cout<<S<<"是否存在"<<T<<endl;
if(a==0)cout<<"不存在"<<endl;
else cout<<"存在,位置是"<<a<<endl;
return 0;
}
2.刪除子串:編寫一個演算法void strDelete(seqstring*S,int pos,int len),從串S中刪除第pos個字元開始長度為len的子串。要求:1≤pos≤S->length-len+1
//seqstring.h
//本標頭檔案為實驗三第一問串的順序儲存
#include<iostream>
using namespace std;
const int size=100;
class seqstring //串採用順序儲存結構
{
private:
char str[size];
int len;
public:
seqstring(){len=0;} //無引數建構函式
seqstring(char a[],int n); //有引數建構函式
~seqstring(){} //解構函式
void Delete(int i); //刪除第i個位置的元素
void printstring(); //顯示串的內容
char get(int i);//得到位置i的元素
};
seqstring::seqstring(char a[],int n)//有引數建構函式
{
for(int i=0;i<n;i++)
str[i]=a[i];
str[n]='\0';
len=n;
}
void seqstring::printstring() //顯示串的內容
{
for(int i=0;i<len;i++)
cout<<str[i];
cout<<endl;
}
void seqstring::Delete(int i)//刪除第i個位置的元素
{
int j=0;
for(j=i;j<len;j++)
{
str[j-1]=str[j];
}
len--;
}
char seqstring::get(int i)//得到位置i的元素
{
return str[i];
}
//main.cpp
#include<iostream>
#include"seqstring.h"
using namespace std;
int BF(seqstring s,seqstring t)//樸素模式匹配演算法
{
int i,j;
i=0;j=0;
while((s.get(i)!='\0')&&(t.get(j)!='\0'))
{
if(s.get(i)==t.get(j))
{
i++;j++;
}
else
{
i=i-j+1;j=0;
}
}
if(t.get(j)=='\0')return(i-j+1); //存在查詢的字串返回位置
else return 0; //不存在返回0
}
int main()
{
char S[]="aaaabc"; //測試aaaabc中是否存在abc
char T[]="abc";
seqstring s(S,6);
seqstring t(T,3);
int a;
a=BF(s,t);
cout<<S<<"是否存在"<<T<<endl;
if(a==0)cout<<"不存在"<<endl;
else cout<<"存在,位置是"<<a<<endl;
return 0;
}
相關推薦
資料結構實驗四 串(模式匹配,刪除子串)
實驗三串 一、 實驗目的 1. 熟悉串的順序儲存結構 2. 掌握串的基本運算及應用 二、 實驗內容 1.模式匹配:串採用順序儲存結構,編寫樸素模式匹配演算法,查詢在串中是否存在給定的子
資料結構與演算法隨筆之------最長迴文子串四種方法求解(暴力列舉+動態規劃+中心擴充套件+manacher演算法(馬拉車))
所謂迴文串,就是正著讀和倒著讀結果都一樣的迴文字串。 比如: a, aba, abccba都是迴文串, ab, abb, abca都不是迴文串。 一、暴力法 方法一:直接暴力列舉 求每一個子串時間複雜度O(N^2), 判斷子串是不是迴文O(N),兩者是相乘關係,所以時間
資料結構實驗四順序表二叉樹
#include<iostream> #include<string> #define MaxSize 100 using namespace std; class Tree {private: string array[100];
資料結構實驗一:(1)(順序表)線性表的各種操作SqList
#include<iostream> #include<malloc.h> #include<cstdio> #define MAXSIZE 10 using namespace std; //typedef struct SqList
資料結構實驗七 圖(深度優先遍歷)
一、 實驗目的 1. 熟悉圖的鄰接矩陣和鄰接表的儲存結構 2. 熟悉圖的鄰接矩陣和鄰接表的建立演算法 3. 掌握圖的遍歷演算法 二、 實驗內容 1. 無向圖採用鄰接矩陣儲存,編寫深
Python 資料結構與演算法——列表(連結串列,linked list)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
【資料結構】單鏈表(無頭單向非迴圈連結串列)各個介面的實現
順序表存在的問題: 中間/頭部的插入刪除,時間複雜度為O(N) 增容需要申請新空間,拷貝資料,釋放舊空間。會有不小的消耗 增容一般是呈2倍的增長,勢必會有一定的空間浪費。 例如當前容量為100,滿了以後增容到200,如果再繼續插入了5個數據,後面沒有資料插入了,
Java資料結構:排序演算法(氣泡排序,選擇排序,插入排序,希爾排序,快速排序,堆排序和合並排序)
public class 氣泡排序 { public static void main(String[] args) { int a[] = { 1, 9, 6, 8, 5, 65, 65, 84, 1, 2, 5, 23, 7, 889 }; for (int i
資料結構之線性表(順序表,單鏈表,迴圈連結串列,雙向連結串列)-- 圖書管理系統
順序表 #include <iostream> #include <cstring> #include <cstdlib>///exit()標頭檔案exit(0):正常執行程式並退出程式。exit(1):非正常執行導致退出程式 #incl
資料結構實驗之棧與佇列四:括號匹配(SDUT 2134)
#include <bits/stdc++.h> using namespace std; typedef long long ll; char s[100]; char a[100]; int main() { int i,j,k,f,top,len; while(
資料結構例程——串的模式匹配(Brute-Force演算法)
問題:模式匹配,設有主串s和子串t,在主串s中找到一個與子串t相等的子串。 解答:(標頭檔案sqstring.h見順序串演算法庫) #include <stdio.h> #inc
資料結構實驗之棧四:括號匹配(棧的運用)
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int i,j,n,l; char s[150],p[150]; while(gets(s)!=NULL)
資料結構之串的模式匹配(C語言實現)
一、暴力匹配演算法(BF) BF全稱為Brute-Force,最簡單直觀的模式匹配演算法。 1.演算法思想 兩個字串進行匹配時,一個主串和一個模式串,就是按照我們最容易想到的演算法來進行匹配。用兩個變數i,j分別記錄主串和模式串的匹配位置,如果兩者在某個字
資料結構(串的模式匹配)
#include <stdio.h>#include <malloc.h>#include <string.h>typedef struct{char *ch;int length;}Hstring;void Initstring(Hstr
數據結構(三)串---KMP模式匹配算法之獲取next數組
要求 求值 直接 都是 malloc image turn src 計算 (一)獲取模式串T的next數組值 1.回顧 我們所知道的KMP算法next數組的作用 next[j]表示當前模式串T的j下標對目標串S的i值失配時,我們應該使用模式串的下標為next[j]接著去和
數據結構(三)串---KMP模式匹配算法實現及優化
warn 查看 技術分享 方法 sign 匹配 pan 相同 span KMP算法實現 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include
大資料之scala(四) --- 模式匹配,變數宣告模式,樣例類,偏函式,泛型,型變,逆變,隱式轉換,隱式引數
一、模式匹配:當滿足case條件,就終止 ---------------------------------------------------------- 1.更好的switch var x = '9'; x match{ case
資料結構- 串的模式匹配演算法 BF和 KMP演算法
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
資料結構實驗之二叉樹四:(先序中序)還原二叉樹 (SDUT 3343)
#include <bits/stdc++.h> using namespace std; struct node { char data; struct node *lc, *rc; }; char a[100],b[100]; int n; struct node
資料結構實驗之排序四:尋找大富翁(SDUT 3401)
#include <stdio.h> #include <stdlib.h> #include <string.h> void Swap(int a[], int i, int j) // 交換函式 { int t = a[i]; a[i]