private void button7_Click(object sender, EventArgs e) { // 初始化DFA数据 List dfaStates = new List(); // DFA状态集合 List dfaAccepts = new List(); // DFA接受符号集合 List dfaTransitions = new List(); // DFA转移集合 List<List> dfaTable = new List<List>(); // DFA转移表 List dfaStartState = new List(); // DFA初始状态集合 List dfaFinalStates = new List(); // DFA终止状态集合

// 获取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);
VS软件用C#语言编写函数private void button7_Clickobject sender EventArgs e实现NFA转DFA功能并把DFA数据分为三列起始状态、接受符号、到达状态放在listview2容器中NFA数据已经保存在string lines数据中了而且在listView1容器中显示了三列起始状态、接受符号、到达状态数据。同时label5和label7中文本要显示DF

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

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