private void button7_Clickobject sender EventArgs e函数在VS软件中利用C#语言实现根据NFA数据生成DFA文件数据功能NFA数据已经显示listView1容器中了生成DFA数据显示listView2容器的三列中两个容器已经被分为起始状态、接受符号、到达状态三列。文件的初始状态集、终止状态集和符号集已经保存在string lines;string
以下是实现该功能的代码:
private void button7_Click(object sender, EventArgs e)
{
// 获取NFA数据
List
// 生成DFA数据
List<string> dfaData = new List<string>();
// 添加起始状态
dfaData.Add(startSymbol);
// 遍历每个状态集
for (int i = 0; i < dfaData.Count; i++)
{
string state = dfaData[i];
// 遍历每个符号
foreach (string symbol in symbolSet)
{
// 获取到达状态集
List<string> reachStates = new List<string>();
foreach (string nfaLine in nfaData)
{
string[] nfaParts = nfaLine.Split(',');
if (nfaParts[0] == state && nfaParts[1] == symbol)
{
reachStates.Add(nfaParts[2]);
}
}
// 如果到达状态集非空
if (reachStates.Count > 0)
{
// 将到达状态集排序
reachStates.Sort();
// 判断是否已经存在该状态集
int index = dfaData.IndexOf(string.Join(",", reachStates));
if (index == -1)
{
// 添加新状态集
dfaData.Add(string.Join(",", reachStates));
// 添加转移
string dfaLine = state + "," + symbol + "," + string.Join(",", reachStates);
listView2.Items.Add(new ListViewItem(new string[] { state, symbol, string.Join(",", reachStates) }));
}
else
{
// 添加转移
string dfaLine = state + "," + symbol + "," + dfaData[index];
listView2.Items.Add(new ListViewItem(new string[] { state, symbol, dfaData[index] }));
}
}
}
}
// 添加终止状态
for (int i = 0; i < dfaData.Count; i++)
{
string[] dfaParts = dfaData[i].Split(',');
foreach (string endState in endSymbol.Split(','))
{
if (dfaParts.Contains(endState))
{
listView2.Items[i].SubItems.Add("是");
break;
}
}
}
}
其中,listView1是NFA数据的容器,listView2是DFA数据的容器,lines是文件中的状态集数据,startSymbol是文件中的初始状态集数据,endSymbol是文件中的终止状态集数据,symbolSet是文件中的符号集数据
原文地址: http://www.cveoy.top/t/topic/chVT 著作权归作者所有。请勿转载和采集!