NFA(子集算法,DFA最小化)代码实现

该博客主要介绍了如何使用C++实现NFA(非确定有限状态自动机)的子集算法和DFA(确定有限状态自动机)的最小化过程。通过读取NFA的转换函数,构建并输出DFA的状态转移矩阵,最后完成DFA的最小化操作。
摘要由CSDN通过智能技术生成
#include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int maxn=1001;

/*
NFA五元组
M={K,A,f,S,Z};
K::状态集合
A::字母表
F::转换函数
S::开始状态
Z::结束状态
*/

/*状态集合K中的结点*/
string node;

/*字母表A中的符号*/
string cas;

//NFA边数
int N;

/*转换函数f*/
struct f
{
    string u,w,v;
    //起点,条件,终点
};

struct change
{
    string ta;
    string arr[maxn];
};

void none(int a)
{
    int i;
    for(i=0; i<a; i++)
    {
        cout<<' ';
    }
}

void Sort(string &a)
{
    int i,j;
    char b;
    for(j=0; j<a.length(); j++)
        for(i=0; i<a.length(); i++)
            if(node.find(a[i])>node.find(a[i+1]))
            {
                b=a[i];
                a[i]=a[i+1];
                a[i+1]=b;
            }
}

void eclouse(char c,string &he,f b[])
{
    int k;
    for(k=0; k<N; k++)
    {
        if(c==b[k].u[0])
            if(b[k].w=="*")
            {
                if(he.find(b[k].v)>he.length())
                    he+=b[k].v;
                eclouse(b[k].v[0],he,b);
            }
    }
}

void movex(change &he,int m,f b[])
{
    int i,j,k,l;

    k=he.ta.length();
    l=he.arr[m].length();

    for(i=0; i<k; i++)
        for(j=0; j<N; j++)
            if((cas[m]==b[j].w[0])&&(he.ta[i]==b[j].u[0]))
                if(he.arr[m].find(b[j].v[0])>he.arr[m].length())
                    he.arr[m]+=b[j].v[0];

    for(i=0; i<l; i++)
        for(j=0; j<N; j++)
            if((cas
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值