1. 程式人生 > >資料結構實驗四 串(模式匹配,刪除子串)

資料結構實驗四 串(模式匹配,刪除子串)

實驗三串
一、 實驗目的
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]