栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构:构建串的定长顺序存储结构;实现串的创建,串的访问输出;实现模式串和主串的简单匹配算法和kmp模式匹配算法。

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构:构建串的定长顺序存储结构;实现串的创建,串的访问输出;实现模式串和主串的简单匹配算法和kmp模式匹配算法。

C语言环境:

#include
#include
#define maxsize 30
typedef struct {
    char ch[maxsize];
    int len;
}sstring;

int init(sstring* p);
void strclear(sstring* p);
void strenter(sstring* p, char a);
char strdel(sstring* p);
int strmat(sstring* m, sstring* p);
void getnext(sstring* m, int* next);
int kpm(sstring* m, sstring* p);
int matched();
void menu();

int main() {
    menu();
}
int init(sstring *p) {
    p->len = 0;
    return 1;
}
void strclear(sstring* p) {
    p->len = 0;
}
void strenter(sstring* p, char a) {
    if (p->len == maxsize - 1) { printf("串已满!n"); return; }
    p->ch[p->len] = a;
    p->len++;
}
char strdel(sstring* p) {
    if (p->len == 0) { printf("串已空!n"); return false; }
    p->len--;
    return p->ch[p->len];
}
int strmat(sstring* m, sstring* p) {
    int i, j;
    for ( i = 0; i < m->len - p->len;i++) {
        for ( j = 0; j < p->len; j++) {
            if (m->ch[i + j] != p->ch[j]) {
                break;
            }
        }
        if (j == p->len) {
            return i+1;
        }
    }
    return -1;
}
void getnext(sstring* m, int *next) {
    next[0] = -1;
    int i = 0, j = -1;
    while (i < m->len ) {
        if (j == -1 || m->ch[i] == m->ch[j]) { 
            i++;
            j++;
            next[i] = j;
        }
        else j = next[j];
    }
}
int kpm(sstring* m, sstring* p) {
    int next[maxsize];
    getnext(m, next);
    int i=1, j=0;
    while (i < m->len && j < p->len) {
        if (j == -1 || m->ch[i] == p->ch[j]) { 
            i++;
            j++;
        }
        else j = next[j];
        if (j == p->len) { return i - p->len + 1; }
    }
    return -1;
}
int matched() {
    sstring main, pattern;
    int command;
    init(&main);
    init(&pattern);
    printf("输入主串:n");
    scanf("n%s", main.ch);
    main.len = strlen(main.ch);
    printf("输入模式串:n");
    scanf("n%s", pattern.ch,30);
    pattern.len = strlen(pattern.ch);
    if (main.len < pattern.len) { return -1; } 
    printf("选择匹配算法:n");
    printf("1:普通n");
    printf("2:KPMn");
    scanf("%d", &command);
    if (command == 1) {
        return strmat(&main, &pattern);
    }
    else {
        return kpm(&main, &pattern);
    }
}
void menu() {
    int command, judge = 1;
    sstring a; char b;int x;
    while (judge == 1) {
        printf("选择操作:n");
        printf("1:初始化n");
        printf("2:销毁n");
        printf("3:录入n");
        printf("4:删除n");
        printf("5:匹配算法n");
        printf("6:结束n");
        scanf("n%d", &command);
        switch (command) {
        case 1:if (init(&a)) { printf("初始化已完成n"); }
              else { printf("初始化不成功n"); }; break;
        case 2:strclear(&a); break;
        case 3:printf("输入一个元素:n");
            scanf("n%c", &b);
            strenter(&a, b);break;
        case 4:printf("%cn", strdel(&a)); break;
        case 5:x = matched(); if (x != -1) { printf("匹配n%dn", x); }
              else { printf("不匹配n"); } break;
        default:judge = 0; break;
        }
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/849152.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号