private void button7_Click(object sender, EventArgs e) { // 获取NFA数据 List<string[]> nfaList = new List<string[]>(); foreach (ListViewItem item in listView1.Items) { string[] nfaData = new string[3]; nfaData[0] = item.SubItems[0].Text; nfaData[1] = item.SubItems[1].Text; nfaData[2] = item.SubItems[2].Text; nfaList.Add(nfaData); }

// 获取所有状态和符号
List<string> states = new List<string>();
List<string> symbols = new List<string>();
foreach (string[] nfaData in nfaList)
{
    if (!states.Contains(nfaData[0]))
    {
        states.Add(nfaData[0]);
    }
    if (!states.Contains(nfaData[2]))
    {
        states.Add(nfaData[2]);
    }
    if (!symbols.Contains(nfaData[1]) && nfaData[1] != '#')
    {
        symbols.Add(nfaData[1]);
    }
}

// 初始化DFA数据
List<string[]> dfaList = new List<string[]>();
string startState = '0';
string endStates = '';
List<string> currentStates = new List<string>();
currentStates.Add(startState);
List<string> newStates = new List<string>();
while (currentStates.Count > 0)
{
    // 计算当前状态集合可以到达的状态集合
    foreach (string symbol in symbols)
    {
        newStates.Clear();
        foreach (string state in currentStates)
        {
            foreach (string[] nfaData in nfaList)
            {
                if (nfaData[0] == state && nfaData[1] == symbol)
                {
                    if (!newStates.Contains(nfaData[2]))
                    {
                        newStates.Add(nfaData[2]);
                    }
                }
            }
        }
        // 如果新状态集合不为空,则添加到DFA数据中
        if (newStates.Count > 0)
        {
            string[] dfaData = new string[3];
            dfaData[0] = string.Join(',', currentStates.ToArray());
            dfaData[1] = symbol;
            dfaData[2] = string.Join(',', newStates.ToArray());
            dfaList.Add(dfaData);
            // 如果新状态集合不在当前状态集合列表中,则添加到列表中
            if (!currentStates.Contains(string.Join(',', newStates.ToArray())))
            {
                currentStates.Add(string.Join(',', newStates.ToArray()));
            }
        }
    }
    // 从当前状态集合中移除已处理的状态集合
    foreach (string state in currentStates)
    {
        if (endStates.Contains(state) && !endStates.Contains(string.Join(',', currentStates.ToArray())))
        {
            endStates += string.Join(',', currentStates.ToArray()) + ';';
        }
    }
    currentStates.RemoveAt(0);
}

// 显示DFA数据
listView2.Items.Clear();
foreach (string[] dfaData in dfaList)
{
    ListViewItem item = new ListViewItem(dfaData);
    listView2.Items.Add(item);
}

// 显示初始状态集和终止状态集
label3.Text = '初始状态集:' + startState;
label4.Text = '终止状态集:' + endStates.TrimEnd(';');

}

C# 使用NFA数据生成DFA文件数据,实现NFA到DFA转换

原文地址: https://www.cveoy.top/t/topic/jM2H 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录