VS使用C#语言现在需要补充代码private void button7_Clickobject sender EventArgs e使用子集构造算法使得在lisview2中生成只有起始状态、接受符号、到达状态三列的DFA文件并在label5中显示初始状态集label7中显示终止状态集private void button3_Clickobject sender EventArgs e
private void button7_Click(object sender, EventArgs e) { //获取NFA中的状态集合 string[] stateSet = lines[2].Substring(lines[2].IndexOf(":") + 1).Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
//将起始状态集合作为第一个子集
List<List<string>> subsets = new List<List<string>>();
List<string> subset1 = new List<string>();
subset1.Add(startSymbol);
subsets.Add(subset1);
//通过子集构造算法生成DFA的状态集合
for (int i = 0; i < subsets.Count; i++)
{
List<string> currentSubset = subsets[i];
foreach (string symbol in symbolSet)
{
List<string> nextSubset = new List<string>();
foreach (string state in currentSubset)
{
foreach (ListViewItem item in listView1.Items)
{
if (item.SubItems[0].Text == state && item.SubItems[1].Text == symbol)
{
if (!nextSubset.Contains(item.SubItems[2].Text))
{
nextSubset.Add(item.SubItems[2].Text);
}
}
}
}
if (nextSubset.Count > 0 && !subsets.Any(s => s.SequenceEqual(nextSubset)))
{
subsets.Add(nextSubset);
}
}
}
//在listview2中生成DFA的状态转移表
listView2.Columns.Add("起始状态", 100);
listView2.Columns.Add("接受符号", 100);
listView2.Columns.Add("到达状态", 100);
foreach (List<string> subset in subsets)
{
ListViewItem item = new ListViewItem(subset.Contains(startSymbol) ? "*" + startSymbol : subset[0]);
item.SubItems.Add(endSymbol);
List<string> nextStates = new List<string>();
foreach (string symbol in symbolSet)
{
List<string> tempStates = new List<string>();
foreach (string state in subset)
{
foreach (ListViewItem listItem in listView1.Items)
{
if (listItem.SubItems[0].Text == state && listItem.SubItems[1].Text == symbol)
{
if (!tempStates.Contains(listItem.SubItems[2].Text))
{
tempStates.Add(listItem.SubItems[2].Text);
}
}
}
}
nextStates.Add(string.Join(",", tempStates));
}
item.SubItems.Add(string.Join(";", nextStates));
listView2.Items.Add(item);
}
//在label5中显示初始状态集
label5.Text = "初始状态集:" + startSymbol;
//在label7中显示终止状态集
List<string> endStates = new List<string>();
foreach (List<string> subset in subsets)
{
if (subset.Any(s => s == endSymbol))
{
endStates.Add(subset.Contains(startSymbol) ? "*" + subset[0] : subset[0]);
}
}
label7.Text = "终止状态集:" + string.Join(",", endStates);
原文地址: https://www.cveoy.top/t/topic/cZxj 著作权归作者所有。请勿转载和采集!