• 串的基本操作


    一、实现主要功能为

    1、输入模式串、目标串

    2、根据目标串生成next[]和nextval[]数组

    3、根据next[]或者nextval[]进行匹配。

    二、程序截图

    三、代码

      1 #include <iostream>
      2 #include <stdio.h>
      3 #include <string.h>
      4 #include <stdlib.h>
      5 using namespace std;
      6 
      7 #define MAXSIZE 1000    //最大字符数
      8 
      9 struct SqString{    //定义顺序串结构
     10     char data[MAXSIZE];
     11     int length;
     12 };
     13 
     14 void GetNext(SqString t,int next[])    //求出模式串t的next数组
     15 {
     16     int j,k;
     17     j=0,k=-1;next[0] = -1;
     18     while(j<t.length-1){
     19         if(k==-1 || t.data[j]==t.data[k]){
     20             j++,k++;
     21             next[j] = k;
     22         }
     23         else
     24             k = next[k];
     25     }
     26 }
     27 
     28 void GetNextval(SqString t,int nextval[])    //求出模式串t的valnext数组
     29 {
     30     int j,k;
     31     j=0,k=-1;nextval[0]=-1;
     32     while(j<t.length){
     33         if(k==-1 || t.data[j]==t.data[k]){
     34             j++;k++;
     35             if(t.data[j]!=t.data[k])
     36                 nextval[j] = k;
     37             else
     38                 nextval[j] = nextval[k];
     39         }
     40         else
     41             k = nextval[k];
     42     }
     43 }
     44 
     45 void printNext(SqString t,int next[])    //输出next数组
     46 {
     47     int i=0;
     48     while(i<t.length){    //分段输出,每段8个数据
     49         int j=i;
     50         printf("j	");
     51         printf("%d	",i++);
     52         for(;i<t.length && i%8;i++){    //输出j
     53             printf("%d	",i);
     54         }
     55         printf("
    ");
     56         printf("next[j]	");
     57         i=j;
     58         printf("%d	",next[i++]);
     59         for(;i<t.length && i%8;i++){    //输出next[j]
     60             printf("%d	",next[i]);
     61         }
     62         printf("
    
    ");    
     63     }
     64 }
     65 
     66 void printNextval(SqString t,int nextval[])    //输出nextval数组
     67 {
     68     int i=0;
     69     while(i<t.length){    //分段输出,每段7个数据
     70         int j=i;
     71         printf("j		");
     72         printf("%d	",i++);
     73         for(;i<t.length && i%7;i++){    //输出j
     74             printf("%d	",i);
     75         }
     76         printf("
    ");
     77         printf("nextval[j]	");
     78         i=j;
     79         printf("%d	",nextval[i++]);
     80         for(;i<t.length && i%7;i++){    //输出next[j]
     81             printf("%d	",nextval[i]);
     82         }
     83         printf("
    
    ");    
     84     }
     85 }
     86 
     87 int KMPIndex1(SqString s,SqString t,int next[])
     88 {
     89     int i=0,j=0;
     90     while(i<s.length && j<t.length){
     91         if(j==-1 || s.data[i]==t.data[j])
     92             i++,j++;
     93         else
     94             j=next[j];
     95     }
     96     if(j>=t.length)
     97         return i-t.length;
     98     else
     99         return -1;
    100 }
    101 
    102 int KMPIndex2(SqString s,SqString t,int nextval[])
    103 {
    104     int i=0,j=0;
    105     while(i<s.length && j<t.length){
    106         if(j==-1 || s.data[i]==t.data[j])
    107             i++,j++;
    108         else
    109             j = nextval[j];
    110     }
    111     if(j>=t.length)
    112         return i-t.length;
    113     else
    114         return -1;
    115 }
    116 
    117 int Menu()    //操作菜单
    118 {
    119     int in;
    120     printf("[1] 输入目标串
    ");
    121     printf("[2] 输入模式串
    ");
    122     printf("[3] 输出模式串的next数组
    ");
    123     printf("[4] 输出模式串的nextval数组
    ");
    124     printf("[5] 使用next[]进行匹配
    ");
    125     printf("[6] 使用nextval[]进行匹配
    ");
    126     printf("[0] 按其他键退出
    ");
    127     scanf("%d",&in);
    128     return in;
    129 }
    130 
    131 void Reply(SqString &s,SqString &t,int next[],int nextval[],int in)    //对菜单的选项进行应答
    132 {
    133     switch(in){
    134     case 1:    //输入目标串
    135         scanf("%s",s.data);
    136         s.length = strlen(s.data);
    137         break;
    138     case 2:    //输入模式串
    139         scanf("%s",t.data);
    140         t.length = strlen(t.data);
    141         GetNext(t,next);
    142         printf("next[]生成成功!
    ");
    143         GetNextval(t,nextval);
    144         printf("nextval[]生成成功!
    
    ");
    145         break;
    146     case 3:    //输出模式串的next数组
    147         if(next[0]==0){
    148             printf("您还没有输入模式串!
    
    ");
    149             break;
    150         }
    151         printNext(t,next);
    152         break;
    153     case 4:    //输出模式串的nextval数组
    154         if(next[0]==0){
    155             printf("您还没有输入模式串!
    
    ");
    156             break;
    157         }
    158         printNextval(t,nextval);
    159         break;
    160     case 5:    //使用next[]进行匹配
    161         if(s.data[0]==''){
    162             printf("您还没有输入目标串!无法匹配!
    
    ");
    163             break;
    164         }
    165         if(next[0]==0){
    166             printf("您还没有输入模式串!
    
    ");
    167             break;
    168         }
    169         in = KMPIndex1(s,t,next);
    170         if(in==-1)
    171             printf("匹配失败!
    
    ");
    172         else {
    173             printf("使用next数组匹配成功!匹配位置为:%d
    ",in);
    174             printf("匹配情况如下:
    ");
    175             printf("%s
    ",s.data);
    176             while(in--)
    177                 printf(" ");
    178             printf("%s
    
    ",t.data);
    179         }
    180         break;
    181     case 6:    //使用nextval[]进行匹配
    182         if(s.data[0]==''){
    183             printf("您还没有输入目标串!无法匹配!
    
    ");
    184             break;
    185         }
    186         if(next[0]==0){
    187             printf("您还没有输入模式串!
    
    ");
    188             break;
    189         }
    190         in = KMPIndex2(s,t,nextval);
    191         if(in==-1)
    192             printf("匹配失败!
    
    ");
    193         else {
    194             printf("使用nextval数组匹配成功!匹配位置为:%d
    ",in);
    195             printf("匹配情况如下:
    ");
    196             printf("%s
    ",s.data);
    197             while(in--)
    198                 printf(" ");
    199             printf("%s
    
    ",t.data);
    200         }
    201         break;
    202     default:
    203         exit(1);
    204     }
    205     system("pause");
    206     system("cls");
    207 }
    208 
    209 int main()
    210 {
    211     int next[MAXSIZE+1]={0},nextval[MAXSIZE+1]={0};
    212     SqString s={0},t={0};
    213     while(1){
    214         int in = Menu();
    215         Reply(s,t,next,nextval,in);
    216     }
    217     return 0;
    218 }
  • 相关阅读:
    根据连接速度选择地址访问
    ASP.NET探针
    C#格式化成小数
    常用经典SQL语句
    比较两个DataSet,并产生增量数据
    实用JS代码大全
    写入、读取、清除Cookie的类
    Base64加密解密
    HttpModule,HttpHandler,HttpHandlerFactory简单使用
    任务栏自定义怎么删除过去项目
  • 原文地址:https://www.cnblogs.com/yfzhang/p/3961384.html
Copyright © 2020-2023  润新知