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; } } }



