串的模式匹配运算
实验要求
编写一个程序,实现顺序串的各种模式匹配运算,并在此基础上设计主程序完成如下功能:
(1)建立目标串s=‘abcabcdabcdeabcdefabcdefg’和模式串t=‘abcdeabcdefab’;
(2)由模式串t求出next值和nextval值;
(3)采用KMP算法求t在s中的位置;
程序代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define nmax 100
int Index_KMP(char * S, char * T, int pos ,int next[])
{
int i = pos; int j = 1;
while(i<=S[0] && j<= T[0]){
if(j == 0|| S[i] == T[j]){
++i;
++j;
}else{
j = next[j];
}
}
if(j>T[0]) return i-T[0];
else return 0;
}
void get_next(char * T, int next[])
{
int i = 1; next[1] = 0;int j = 0;
while(i < T[0]){
if(j == 0|| T[i] == T[j]){
++i;
++j;
next[i] = j;
}
else j = next[j];
}
}
void get_nextval(char * T, int nextval[])
{
int i = 1; nextval[1] = 0;int j = 0;
while(i <T[0]){
if(j == 0|| T[i] == T[j]){
++i;
++j;
if(T[i] != T[j]) nextval[i] = j;
else nextval[i] = nextval[j];
}
else j = nextval[j];
}
}
void Paint()
{
printf("|"); printf(" The Experiment Of String ") ;printf("|\n");
printf("|"); printf(" KMP ") ;printf("|\n");
printf("|"); printf(" Author: Luo Peng Fei ") ;printf("|\n");
printf("|"); printf(" Date:2017/4/12 ") ;printf("|\n");
}
int main()
{
freopen("in.txt","r",stdin);
char S[nmax]="",T[nmax]="";
Paint();
int next[nmax+5],nextval[nmax+5];
printf("|"); printf(" 请输入目标串: ") ;printf("|\n");
scanf("%s",S+1);
printf("|"); printf(" 请输入模式串: ") ;printf("|\n");
scanf("%s",T+1);
printf("|"); printf(" 求得的next数组为 ") ;printf("|\n");
S[0] = strlen(S+1);
T[0] = strlen(T+1);
get_next(T,next);
for(int i = 1; i<=strlen(T+1);++i)
printf("%d ",next[i]);
printf("\n");
printf("|"); printf(" 求得的nextal数组为 ") ;printf("|\n");
get_nextval(T,nextval);
for(int i = 1; i<=strlen(T+1);++i)
printf("%d ",nextval[i]);
printf("\n");
int index = Index_KMP(S,T,0,next);
printf("|"); printf(" 求得的KMP结果为 ") ;printf("|\n");
printf("%d\n",index);
printf("\n");
return 0;
}
运行结果
采用freopen重定向输入
数据
数组的操作
实验要求
- 建立一个n*n的对称矩阵A;用动态分配的一维数组B对矩阵A进行压缩存储,输出矩阵A和一维数组B;
- 在B中查找对称矩阵A中第row行,第col列(下标从1开始)的元素,输出该元素值;
- 建立一个稀疏矩阵C,输入其行数,列数和非零元个数,用三元组顺序表存储该矩阵,并按矩阵形式输出稀疏矩阵B;
- 对稀疏矩阵C做快速转置运算得到矩阵D,并按矩阵形式输出转置后的矩阵D。
要求
- 矩阵元素相关信息要从终端输入;
- 在三元组顺序表中按行优先顺序存放非零元素;
- 具体的输入和输出格式不限;
- 算法要具有较好的健壮性,对错误操作要做适当处理。
程序代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define nmax 100
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;
typedef struct {
int i,j;
ElemType e;
}Triple;
typedef struct {
Triple data[MAXSIZE+1];
int mu,nu,tu;
}TSMatrix;
int matrix[nmax][nmax];
void Init_Matrix(int n,int m)
{
for(int i = 1; i<=n; ++i){
for(int j = 1; j<=m; ++j){
scanf("%d",&matrix[i][j]);
}
}
}
int * Compress_Matrix(int n)
{
int* base = (int*)malloc(sizeof(int)*((n*(n+1)/2)));
int k = 0;
for(int i = 1 ;i<=n;++i){
for(int j = 1; j<=i; ++j){
base[k++] = matrix[i][j];
}
}
return base;
}
void output(int n, int m)
{
for(int i = 1; i<=n; ++i){
for(int j = 1; j<=m; ++j){
printf("%d ",matrix[i][j]);
}
printf("\n");
}
}
void output_CompMatri(int n,int *base)
{
for(int i = 0; i<n*(n+1)/2;++i)
printf("%d ",base[i]);
printf("\n");
}
void Paint()
{
printf("|"); printf(" The Experiment Of Array ") ;printf("|\n");
printf("|"); printf(" Array & Matrix ") ;printf("|\n");
printf("|"); printf(" Author: Luo Peng Fei ") ;printf("|\n");
printf("|"); printf(" Date:2017/4/12 ") ;printf("|\n");
}
int find_item(int *base)
{
int i,j;
scanf("%d%d",&i,&j);
int ans = i*(i-1)/2 +j -1;
return base[ans];
}
void input_TSM(int temp[][MAXSIZE],TSMatrix &M)
{
int x ,y,ele;
for(int i = 1; i<=M.tu;++i){
scanf("%d %d %d",&x,&y,&ele);
M.data[i].i = x;
M.data[i].j = y;
M.data[i].e = ele;
temp[x][y] = ele;
}
}
void output_TSM(int temp[][MAXSIZE],TSMatrix &M)
{
for(int i = 1; i<=M.mu;++i){
for(int j = 1; j<=M.nu;++j){
printf("%2d ",temp[i][j]);
}
printf("\n");
}
}
Status FastTransposeSMatrix(TSMatrix M, TSMatrix &T)
{
T.mu = M.nu; T.nu = M.mu; T.tu = M.tu;
int num[MAXSIZE],cpot[MAXSIZE];
if(T.tu){
for(int col = 1; col<=M.nu;++col){
num[col] = 0;
}
for(int t = 1; t<=M.mu;++t){
++num[M.data[t].j];
}
cpot[1] = 1;
for(int col = 2;col<=M.mu;++col){
cpot[col] = cpot[col-1]+ num[col-1];
}
for(int p = 1;p <=M.tu;++p){
int col = M.data[p].j, q = cpot[col];
T.data[q].i = M.data[p].j;
T.data[q].j = M.data[p].i;
T.data[q].e = M.data[p].e;
++cpot[col];
}
}
return OK;
}
void get(int temp[][MAXSIZE],TSMatrix &M)
{
int x ,y,ele;
for(int i = 1; i<=M.tu;++i){;
x = M.data[i].i;
y = M.data[i].j;
ele = M.data[i].e;
temp[x][y] = ele;
}
}
int main()
{
int n;
TSMatrix M,T;
printf("|"); printf(" 请输入对称矩阵的大小 ") ;printf("|\n");
scanf("%d",&n);
if(n<=0){printf("矩阵大小错误!\n");exit(0);}
printf("|"); printf(" 请按行输入此对称矩阵 ") ;printf("|\n");
Init_Matrix(n,n);
printf("|"); printf(" 对称矩阵的信息为 ") ;printf("|\n");
output(n,n);
printf("|"); printf(" 对称矩阵的压缩结果为 ") ;printf("|\n");
int * base = Compress_Matrix(n);
output_CompMatri(n,base);
printf("|"); printf(" 请输入要查询的行和列 ") ;printf("|\n");
printf("%d\n",find_item(base));
printf("|"); printf(" 请依次输入稀疏矩阵的行数,列数和非零元个数 ") ;printf("|\n");
scanf("%d %d %d",&M.mu,&M.nu,&M.tu);
int temp[MAXSIZE][MAXSIZE];memset(temp,0,sizeof(temp));
printf("|"); printf(" 请依次输入稀疏矩阵的%d个元素 ",M.tu) ;printf("|\n");
input_TSM(temp,M);
printf("|"); printf(" 稀疏矩阵的信息为 ") ;printf("|\n");
output_TSM(temp,M);
printf("|"); printf(" 转置后矩阵的信息为 ") ;printf("|\n");
FastTransposeSMatrix(M,T);
memset(temp,0,sizeof(temp));
get(temp,T);
output_TSM(temp,T);
return 0;
}
运行结果
采用freopen重定向输入
数据