确定有穷自动机
思路:
将状态与对应的行,符号与对应的列 索引进行映射,输入规则为状态转换表,之后输入待判断的字符串,判断是否会被自动机接受
package com.parting_soul;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/**
* 确定有穷自动机
* 将状态与对应的行,符号与对应的列 索引进行映射
* @author parting_soul
*
*/
public class Dfa {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
DfaStorage s = new DfaStorage();
s.inputDFA();
s.print();
String str = null;
while (!(str = in.nextLine()).equals("-1")) {
System.out.println(s.judge(str));
}
}
}
class DfaStorage {
int[][] maxtra = new int[100][];
int kNum, eNum;
Map<String, Integer> K = new HashMap<>();
Map<String, Integer> E = new HashMap<>();
Map<String, Integer> exit = new HashMap<>();
int currentState = 0;
/**
* 判断句子是否被DFA所接受
*
* @param str
* @return
*/
public boolean judge(String str) {
for (int i = 0; i < str.length(); i++) {
String c = String.valueOf(str.charAt(i));
int nextState = -1;
Integer inter = E.get(c);
if (inter != null) {
nextState = maxtra[currentState][inter];
}
if (nextState == -1 || inter == null) {
return false;
}
currentState = nextState;
}
System.out.println(currentState);
if (exit.get(getState(currentState)) == 1) {
return true;
}
return false;
}
/**
* 取得当前的状态(终结,非终结)
*
* @param value
* @return
*/
public String getState(int value) {
for (Map.Entry<String, Integer> entry : K.entrySet()) {
if (entry.getValue().equals(value)) {
return entry.getKey();
}
}
return null;
}
public DfaStorage() {
// TODO Auto-generated constructor stub
}
/**
* 输入状态转换表
*/
public void inputDFA() {
Scanner in = new Scanner(System.in);
System.out.println("输入自动机状态个数和自动机符号个数");
kNum = in.nextInt();
eNum = in.nextInt();
System.out.println("输入自动机状态:(第一个默认为开始符) 第二个输入为是否是结束符");
for (int i = 0; i < kNum; i++) {
String k = in.next();
K.put(k, i);
int isExit = in.nextInt();
exit.put(k, isExit);
}
System.out.println("输入自动机符号");
for (int i = 0; i < eNum; i++) {
String e = in.next();
E.put(e, i);
}
init();
System.out.println("输入状态函数转换表");
for (int i = 0; i < kNum; i++) {
for (int j = 0; j < maxtra[i].length; j++) {
maxtra[i][j] = K.get(in.next());
}
}
}
/**
* 初始化maxtra初始状态为不可达
*/
private void init() {
for (int i = 0; i < kNum; i++) {
maxtra[i] = new int[eNum];
for (int j = 0; j < maxtra[i].length; j++) {
maxtra[i][j] = -1;
}
}
}
public void print() {
for (int i = 0; i < kNum; i++) {
for (int j = 0; j < eNum; j++) {
System.out.print(maxtra[i][j] + " ");
}
System.out.println();
}
for (Map.Entry<String, Integer> entry : exit.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
}