C# 实现 NFA 转 DFA 功能,并显示 DFA 数据在 ListView 中
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);
}
原文地址: https://www.cveoy.top/t/topic/jNDB 著作权归作者所有。请勿转载和采集!