Java 模擬DFA(有窮自動機)的執行過程

上編譯原理老師出的一道題:判斷字符能否被有窮自動機接收

在這裏插入圖片描述

/**
 * 測試類
 * @Author: 東方老贏
 * @Date: 2020/3/25 14:40
 */
public class Test {
    public static void main(String[] args) {
        //矩陣
        int[][] matrix = new int[][]{{2,1,-1,-1},{3,1,-1,-1},{-1,5,2,4},{-1,6,2,4},{3,1,-1,-1},{-1,5,-1,-1},{-1,5,-1,-1}};
        //終結集
        int[] ends = new int[]{4,5,6};
        //測試字符
        String a = "ad";
        DFADemo dfaDemo = new DFADemo();
        System.out.println(dfaDemo.getResult(ends,matrix,a));
    }
}
/**
 * DFA類
 * @Author: 東方老贏
 * @Date: 2020/3/25 12:59
 */
public class DFADemo {
    char[] arr = new char[]{'a','b','c','d'};
    private int[][] matrix;
    private int[] ends;
    private int start,end;
    private String str;

    public DFADemo(){

    }
    //最終結果
    public boolean getResult(int[] ends,int[][] matrix,String str){
        for (int i = 0; i < ends.length; i++) {
            this.ends = ends;
            this.matrix = matrix;
            this.str = str;
            start = 0;
            end = ends[i];
            boolean b = result(str);
            if (b == true){
                return b;
            }
        }
        return false;
    }

    public boolean result(String str){
        //將字符串存成數組
        char[] strs = new char[str.length()];
        for (int i = 0; i < str.length(); i++) {
            strs[i] = str.charAt(i);
        }
        //遍歷數組
        int a = start;
        for (int i = 0; i < strs.length&&a!=-1; i++) {
                int next = Getnext(a,strs[i]);
                a = next;
        }
        //判斷結果
        if (a != -1 && a==end){
            return true;
        }else {
            return false;
        }
    }
    //遍歷matrix的第a行
    private int Getnext(int a, char str) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == str){
                if (matrix[a][i] != -1){
                    return matrix[a][i];
                }
            }
        }
       return -1;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章