private void button7_Click(object sender, EventArgs e) { // 获取开始符号和终结符号 int startSymbol = int.Parse(lines[0].Split(':')[1].Trim()); int endSymbol = int.Parse(lines[1].Split(':')[1].Trim());

// 获取符号集
string[] symbolSet = lines[2].Split(':')[1].Split(';');

// 定义 NFA 转 DFA 的数据结构
Dictionary<HashSet<int>, Dictionary<string, HashSet<int>>> dfa = new Dictionary<HashSet<int>, Dictionary<string, HashSet<int>>>();

// 初始化 DFA 的起始状态集
HashSet<int> startStateSet = new HashSet<int>();
startStateSet.Add(startSymbol);

// 将起始状态集加入 DFA
dfa.Add(startStateSet, new Dictionary<string, HashSet<int>>());

// 初始化 DFA 的终止状态集
HashSet<HashSet<int>> endStateSet = new HashSet<HashSet<int>>();

// 初始化 DFA 的状态集
List<HashSet<int>> stateList = new List<HashSet<int>>();
stateList.Add(startStateSet);

// 计算 DFA 的状态集和转移函数
for (int i = 0; i < stateList.Count; i++)
{
    HashSet<int> state = stateList[i];
    Dictionary<string, HashSet<int>> transitions = dfa[state];

    // 计算每个符号的转移状态集
    foreach (string symbol in symbolSet)
    {
        HashSet<int> transitionState = new HashSet<int>();
        foreach (int s in state)
        {
            // 查找该状态下该符号的转移状态集
            foreach (string line in lines.Skip(3))
            {
                string[] parts = line.Split();
                if (int.Parse(parts[0]) == s && parts[1] == symbol)
                {
                    transitionState.Add(int.Parse(parts[2]));
                }
            }
        }

        // 如果转移状态集不为空,则加入 DFA
        if (transitionState.Count > 0)
        {
            // 如果该状态集未出现过,则加入状态集列表
            if (!stateList.Contains(transitionState))
            {
                stateList.Add(transitionState);
            }

            // 将转移状态集加入转移函数
            transitions.Add(symbol, transitionState);

            // 如果该状态集包含终结符,则加入终止状态集
            if (transitionState.Contains(endSymbol))
            {
                endStateSet.Add(transitionState);
            }
        }
    }
}

// 将 DFA 数据分为三列起始状态、接受符号、到达状态放在 listview2 容器中
listView2.Items.Clear();
foreach (KeyValuePair<HashSet<int>, Dictionary<string, HashSet<int>>> pair in dfa)
{
    HashSet<int> start = pair.Key;
    Dictionary<string, HashSet<int>> transitions = pair.Value;

    foreach (KeyValuePair<string, HashSet<int>> transition in transitions)
    {
        string symbol = transition.Key;
        HashSet<int> end = transition.Value;

        ListViewItem item = new ListViewItem(new[] { string.Join(',', start), symbol, string.Join(',', end) });
        listView2.Items.Add(item);
    }
}

// 显示 DFA 的初始状态集和终止状态集
label5.Text = string.Join(',', startStateSet);
label7.Text = string.Join(',', endStateSet);

}

C# 实现 NFA 转 DFA 功能,并显示 DFA 数据在 ListView 中

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

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