java实现有限状态自动机FSM(附完整源码)
时间: 2023-11-09 14:07:43 浏览: 48
下面是一个基于Java实现有限状态自动机FSM的示例代码:
```java
import java.util.HashMap;
import java.util.Map;
public class FSM {
private final Map<State, Map<Character, State>> transitionTable;
private State currentState;
public FSM(State initialState) {
transitionTable = new HashMap<>();
currentState = initialState;
}
public void addTransition(State fromState, Character input, State toState) {
transitionTable.putIfAbsent(fromState, new HashMap<>());
transitionTable.get(fromState).put(input, toState);
}
public void setInput(String input) {
for (char c : input.toCharArray()) {
Map<Character, State> transitions = transitionTable.get(currentState);
if (transitions == null) {
throw new IllegalStateException("Invalid state: " + currentState);
}
State nextState = transitions.get(c);
if (nextState == null) {
throw new IllegalStateException(
"Invalid input: " + c + " in state: " + currentState);
}
currentState = nextState;
}
}
public boolean isEndState() {
return currentState.isEndState();
}
public State getCurrentState() {
return currentState;
}
}
class State {
private final boolean isEndState;
public State(boolean isEndState) {
this.isEndState = isEndState;
}
public boolean isEndState() {
return isEndState;
}
@Override
public String toString() {
return "State{" +
"isEndState=" + isEndState +
'}';
}
}
```
在此示例中,我们创建了一个FSM类和一个State类。FSM类包含了一个状态转移表,可以通过addTransition()方法添加状态转移规则,在setInput()方法中,我们将输入字符转换为状态转移表中的下一个状态。isEndState()方法可以检查当前状态是否为终止状态。
State类只有一个构造函数,用于指定该状态是否为终止状态。
这是一个使用FSM类的示例:
```java
public class FSMExample {
public static void main(String[] args) {
State initialState = new State(false);
State state1 = new State(false);
State state2 = new State(true);
FSM fsm = new FSM(initialState);
fsm.addTransition(initialState, 'a', state1);
fsm.addTransition(state1, 'b', state2);
fsm.setInput("ab");
System.out.println("Is end state: " + fsm.isEndState());
System.out.println("Current state: " + fsm.getCurrentState());
}
}
```
在此示例中,我们创建了三个状态,其中第3个状态为终止状态。我们添加了两个状态转移规则,在输入“ab”后,FSM应该处于第3个状态,并且isEndState()方法返回true。