建筑扬尘治理方案:AC多模式匹配算法C实现
来源:百度文库 编辑:偶看新闻 时间:2024/05/06 03:40:21
Quque.h文件
#ifndef QUQUE_H_INCLUDED
#define QUQUE_H_INCLUDED
#include "ac.h"
struct struct_quque
{
int q[MAX_STATE];
int num;
};
typedef struct struct_quque quque;
void init_bfs_quque(quque ** bfs_quque);
int is_empty(quque * bfs_quque);
void in_quque(int n, quque * bfs_quque);
int out_quque(quque * bfs_quque);
#endif // QUQUE_H_INCLUDED
Quque.c文件
#include "quque.h"
#include
void init_bfs_quque(quque ** bfs_quque)
{
(*bfs_quque) = (quque *)malloc(sizeof(quque));
(*bfs_quque)->num = 0;
}
int is_empty(quque * bfs_quque)
{
return bfs_quque->num;
}
void in_quque(int n, quque * bfs_quque)
{
int i = 0;
for(i = bfs_quque->num; i > 0; i--)
bfs_quque->q[i] = bfs_quque->q[i-1];
bfs_quque->q[0] = n;
bfs_quque->num++;
}
int out_quque(quque * bfs_quque)
{
bfs_quque->num--;
return bfs_quque->q[bfs_quque->num];
}
Ac.h文件
#ifndef AC_H_INCLUDED
#define AC_H_INCLUDED
#define MAX_STATE 100 //自动机最大状态数
#define MAX_SYMBOL 256 //匹配的字符数可以匹配所有的ASCII码
#define MAX_MODE 4 //最大模式串数
#define MODE_LEN 10
int DFD[MAX_STATE][MAX_SYMBOL]; //状态转移表--DFA包括转向函数和失效函数
int F[MAX_STATE] ; //失败函数
struct output_t
{
int flag;
char str[MODE_LEN];
}output[MAX_STATE];
int father[MAX_STATE];
unsigned int statecount; //总状态数-1
unsigned int modecount; //模式串数-1
struct struct_quque * bfs_quque;
void printAC();
void init_ac();
void go();
void fail();
void output_str(int state,int j);
void prec();
int AC(unsigned char* s, int http_len);
#endif // AC_H_INCLUDED
Ac.c文件
#include "ac.h"
#include
#include
#include
#include "quque.h"
void printAC()
{
int i = 0;
int j = 0;
printf("DFD\n");
for(i = 0; i < MAX_STATE; i++)
{
for(j = 0; j < MAX_SYMBOL; j++)
{
printf("%d ",DFD[i][j]);
if(j == MAX_SYMBOL - 1)
printf("\n");
}
}
printf("F\n");
for(i = 0; i < MAX_STATE; i++)
printf("%d ",F[i]);
printf("\noutput\n");
for(i = 0; i < MAX_STATE; i++)
printf("%d %s\n",output[i].flag,output[i].str);
}
void init_ac()
{
int i,j;
statecount = 1;
modecount = 0;
for (i = 0 ; i < MAX_STATE; i++)
{
output[i].flag = -1;
output[i].str[0] = '\0';
F[i] = 0;
father[i] = 0;
for (j = 0 ; j < MAX_SYMBOL; j++)
{
DFD[i][j] = 0;
}
}
}
void go()
{
int c;
int currentstate ;
char str[MODE_LEN];
int start = 1;
int temp = 0;
getchar();
printf("input patter strings,interval with blank and end with enter:\n");
while((c = getchar()) != '\n')
{
if (c != ' ')
{
if (start)
{
start = 0;
modecount++;
currentstate = 0;
temp = 0;
}
str[temp++] = c;
if(DFD[currentstate][c] == 0)
{
DFD[currentstate][c] = statecount;
father[statecount] = currentstate;
currentstate = statecount;
statecount++;
}
else
currentstate = DFD[currentstate][c];
}
else
{
output[currentstate].flag = 1;
str[temp] = '\0';
strcpy(output[currentstate].str, str);
start = 1;
if (modecount == MAX_MODE)
{
printf("Max patter string number is: %d",MAX_MODE);
goto END;
}
}
}
output[currentstate].flag = 1;
str[temp] = '\0';
strcpy(output[currentstate].str, str);
return;
END:
printf("Press any key to continue...");
c = getch();
return;
}
void fail()
{
int i,j,t;
int ch;
init_bfs_quque(&bfs_quque);
in_quque(0, bfs_quque);
while(is_empty(bfs_quque))
{
t = out_quque(bfs_quque);
if(t)
{
for(i = 0; i < MAX_SYMBOL; i++)
{
if(DFD[father[t]][i] == t)
{
ch = i;
break;
}
}
j = t;
while((j = F[father[j]]) != 0)
{
if(DFD[j][ch])
{
F[t] = DFD[j][ch];
break;
}
}
if(j == 0)
{
F[t] = (DFD[j][ch] == t)? 0 : DFD[j][ch];
}
}
for(i = 0 ; i < MAX_SYMBOL; i++)
{
if(DFD[t][i] != 0)
in_quque(DFD[t][i], bfs_quque);
}
}
}
void output_str(int state,int j)
{
do
{
if(output[state].str[0])
printf("%d %s\n",j - strlen(output[state].str) + 1, output[state].str);
}
while((state = F[state]) != 0);
}
void prec()
{
printf("init ac\n");
//初始化变量
init_ac();
//建立转向函数
go();
//建立失效函数
fail();
//打印自动机
//printAC();
}
int AC(unsigned char * s, int http_len)
{
int j = -1;
int flag = 0;
int currentstate = 0;
int state = 0;
int i = 0;
while(j++ < http_len)
{
if (s[j] < MAX_SYMBOL)
{
state = DFD[currentstate][s[j]];
if (state == 0)
{
while(currentstate && (!state))
{
state = DFD[F[currentstate]][s[j]];
currentstate = state;
}
}
else
currentstate = state;
if (output[currentstate].flag == 1)
{
output_str(currentstate,j);
flag = 1;
}
}
}
return flag;
}
Actest.c文件
#include "ac.h"
int main(int argc, char **argv)
{
char str[100];
scanf("%s", str);
prec();
AC(str, strlen(str));
}