VS软件用C#语言编写函数private void button7_Clickobject sender EventArgs e实现NFA转DFA功能并把DFA数据分为三列起始状态、接受符号、到达状态放在listview2容器中NFA数据已经保存在string lines数据中了而且在listView1容器中显示了三列起始状态、接受符号、到达状态数据。同时label5和label7中文本要显示DF
private void button7_Click(object sender, EventArgs e)
{
// 初始化DFA数据
List
// 获取NFA数据
string[] lines = {"开始符:7", "终结符:26", "符号集:a;b;", "1\ta\t2", "3\tb\t4", "5\t#\t3", "5\t#\t1", "4\t#\t6", "2\t#\t6", "7\t#\t5", "6\t#\t8", "6\t#\t5", "7\t#\t8", "9\ta\t10", "11\ta\t12", "10\t#\t11", "13\tb\t14", "15\tb\t16", "14\t#\t15", "17\t#\t13", "17\t#\t9", "16\t#\t18", "12\t#\t18", "8\t#\t17", "19\ta\t20", "21\tb\t22", "23\t#\t21", "23\t#\t19", "22\t#\t24", "20\t#\t24", "25\t#\t23", "24\t#\t26", "24\t#\t23", "25\t#\t26", "18\t#\t25"};
// 解析NFA数据
int startState = int.Parse(lines[0].Split(':')[1]);
int endState = int.Parse(lines[1].Split(':')[1]);
string[] symbols = lines[2].Split(':')[1].Split(';');
Dictionary<string, List<string>> transitions = new Dictionary<string, List<string>>();
for (int i = 3; i < lines.Length; i++)
{
string[] parts = lines[i].Split('\t');
string fromState = parts[0];
string symbol = parts[1];
string toState = parts[2];
string key = fromState + "," + symbol;
if (!transitions.ContainsKey(key))
{
transitions[key] = new List<string>();
}
transitions[key].Add(toState);
}
// 初始化DFA初始状态集合
dfaStartState.Add(startState.ToString());
// 构造DFA状态集合和转移集合
Queue<List<string>> unmarkedStates = new Queue<List<string>>();
unmarkedStates.Enqueue(dfaStartState);
while (unmarkedStates.Count > 0)
{
List<string> currState = unmarkedStates.Dequeue();
if (!dfaStates.Contains(string.Join(",", currState)))
{
dfaStates.Add(string.Join(",", currState));
foreach (string symbol in symbols)
{
List<string> toStates = new List<string>();
foreach (string state in currState)
{
string key = state + "," + symbol;
if (transitions.ContainsKey(key))
{
toStates.AddRange(transitions[key]);
}
}
if (toStates.Count > 0)
{
dfaTransitions.Add(string.Join(",", currState) + "," + symbol + "," + string.Join(",", toStates));
if (!dfaStates.Contains(string.Join(",", toStates)))
{
unmarkedStates.Enqueue(toStates);
}
}
}
}
}
// 构造DFA接受符号集合和终止状态集合
foreach (string state in dfaStates)
{
bool isAccept = false;
foreach (string s in state.Split(','))
{
if (int.Parse(s) == endState)
{
isAccept = true;
break;
}
}
if (isAccept)
{
dfaAccepts.Add(state);
dfaFinalStates.Add(state);
}
}
// 显示DFA数据
listView2.Columns.Add("起始状态");
listView2.Columns.Add("接受符号");
listView2.Columns.Add("到达状态");
foreach (string transition in dfaTransitions)
{
string[] parts = transition.Split(',');
ListViewItem item = new ListViewItem(parts[0]);
item.SubItems.Add(parts[1]);
item.SubItems.Add(parts[2]);
listView2.Items.Add(item);
}
label5.Text = string.Join(",", dfaStartState);
label7.Text = string.Join(",", dfaFinalStates);
原文地址: https://www.cveoy.top/t/topic/ciCt 著作权归作者所有。请勿转载和采集!