溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言數據結構之如何解決模式匹配字符串定位問題

發布時間:2021-08-20 09:50:57 來源:億速云 閱讀:154 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“C語言數據結構之如何解決模式匹配字符串定位問題”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“C語言數據結構之如何解決模式匹配字符串定位問題”這篇文章吧。

 主要實現了三種字符串的模式匹配,主要包括字符串子操作的集合,字符串指針回溯,和KMP算法 

頭文件 

#ifndef INDEXHEAD_H_INCLUDED
#define INDEXHEAD_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 255
typedef char Sstring[MAXLEN + 1] ;
int StrAssign( Sstring str , char* ps ) ;
int StrLength( Sstring str ) ;
int StrPrint( Sstring str ) ;
int StrCompare( Sstring str1 , Sstring str2 ) ;
int StrSub( Sstring sub , Sstring str , int pos , int length ) ;
int StrIndex1( Sstring str , Sstring sub , int pos ) ;
int StrIndex2( Sstring str , Sstring sub , int pos ) ;
int StrIndex3( Sstring str , Sstring sub , int pos ) ;
int GetNext( Sstring str , int next[] ) ;
#endif // INDEXHEAD_H_INCLUDED

函數實現

#include "indexhead.h"
int StrAssign( Sstring str , char* ps )
{
  int i = 0 ;
  if( strlen( ps ) > MAXLEN )
  {
    printf( "ERROR!\n" ) ;
    exit( 1 ) ;
  }
  str[i++] = strlen( ps ) ;
  while( i <= strlen( ps ) )
  {
    str[i] = *( ps + i - 1 ) ;
    i++ ;
  }
  return 0 ;
}
int StrPrint( Sstring str )
{
  int i = 1 ;
  while( i <= str[0] )
  {
    printf( "%c" , str[i++] ) ;
  }
  printf( "\n" ) ;
  return 0 ;
}
int StrLength( Sstring str )
{
  return str[0] ;
}
int StrCompare( Sstring str1 , Sstring str2 )
{
  int i = 1 ;
  int ret = 0 ;
  while( i <= str1[0] && i <= str2[0] )
  {
    ret = ( unsigned char )str1[i] - ( unsigned char )str2[i] ;
    if( ret < 0 )
    {
      return -1 ;
    }
    else if( ret > 0 )
    {
      return 1 ;
    }
    else
    {
      i++ ;
    }
  }
  if( i <= str1[0] )
  {
    return -1 ;
  }
  else if( i <= str2[0] )
  {
    return 1 ;
  }
  else
  {
    return 0 ;
  }
}
int StrSub( Sstring sub , Sstring str , int pos , int length )
{
  if( pos < 1 || pos > str[0] || length < 0 || length > str[0] - pos + 1 )
  {
    printf( "ERROR!\n" ) ;
    exit( 1 ) ;
  }
  int i = 1 ;
  sub[0] = length ;
  while( i <= length )
  {
    sub[i] = str[pos + i - 1] ;
    i++ ;
  }
  return 0 ;
}
int StrIndex1( Sstring str , Sstring sub , int pos )
{
  pos = 1 ;
  Sstring stemp ;
  while( pos <= str[0] - sub[0] + 1 )
  {
    StrSub( stemp , str , pos , sub[0] ) ;
    if( !StrCompare( stemp , sub ) )
    {
      return pos ;
    }
    pos++ ;
  }
  return 0 ;
}
int StrIndex2( Sstring str , Sstring sub , int pos )
{
  if( pos < 1 || pos > str[0] - sub[0] + 1 )
  {
    printf( "ERROR!\n" ) ;
    exit( 1 ) ;
  }
  int i = pos ;
  int j = 1 ;
  while( ( i <= str[0] - sub[0] + 1 ) && ( j <= sub[0] ) )
  {
    if( str[i] == sub[j] )
    {
      i++ ;
      j++ ;
    }
    else
    {
      i = i - j + 2 ;
      j = 1 ;
    }
  }
  if( j > sub[0] )
  {
    return i - sub[0] ;
  }
  return 0 ;
}
int GetNext( Sstring str , int next[] )
{
  int i = 1 ;
  next[1] = 0 ;
  int j = 0 ;
  while( i < str[0] )
  {
    if( j== 0 || str[i] == str[j] )
    {
      ++i ;
      ++j ;
      next[i] = j ;
    }
    else
    {
      j = next[j] ;
    }
  }
  return 0 ;
}
int StrIndex3( Sstring str , Sstring sub , int pos )
{
  int i = pos ;
  int j = 1 ;
  int next[ sub[0] ] ;
  GetNext( sub , next ) ;
  while( i <= str[0] && j <= sub[0] )
  {
    if( j == 0 || str[i] == sub[j] )
    {
      ++i ;
      ++j ;
    }
    else
    {
      j = next[j] ;
    }
  }
  if( j > sub[0] )
  {
    return i - sub[0] ;
  }
  return 0 ;
}

 測試匹配函數

#include "indexhead.h"
int main()
{
  /*Sstring str ;
  Sstring str1 ;
  char* p = "hello" ;
  StrAssign( str , p ) ;
  StrAssign( str1 , "ahello" ) ;
  StrPrint( str ) ;
  int i = StrLength( str ) ;
  printf( "%d\n" , i ) ;
  int j = StrCompare( str , str1 ) ;
  printf( "%d\n" , j ) ;
  StrSub( str , str1 , 3 , 4 ) ;
  StrPrint( str ) ;*/
  /*Sstring str1 ;//驗證StrIndex1()
  Sstring sub ;
  StrAssign( str1 , "shfiodshfdghafhs" ) ;
  StrAssign( sub , "dgh" ) ;
  int i = StrIndex1( str1 , sub , 1 ) ;
  printf( "%d\n" , i ) ;*/
  /*Sstring str1 ;//驗證StrIndex2()
  Sstring sub ;
  StrAssign( str1 , "shfiodshfdghafhs" ) ;
  StrAssign( sub , "dgh" ) ;
  int i = StrIndex2( str1 , sub , 1 ) ;
  printf( "%d\n" , i ) ;*/
  Sstring str1 ;//驗證StrIndex3()
  Sstring sub ;
  StrAssign( str1 , "shfiodshfdghafhs" ) ;
  StrAssign( sub , "dgh" ) ;
  int i = StrIndex3( str1 , sub , 1 ) ;
  printf( "%d\n" , i ) ;
  return 0;
}

以上是“C語言數據結構之如何解決模式匹配字符串定位問題”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女