使用java语言做一个识别算法确定“有穷自动机”
二维数组表示状态转换表
注:当输入后没有下一个状态可以转换则用-1表示
状态\输入 | a | b | c | d |
---|---|---|---|---|
1 | 3 | 2 | -1 | -1 |
2 | 4 | 2 | -1 | -1 |
3 | -1 | 6 | 3 | 5 |
4 | -1 | 6 | 3 | 5 |
5 | -1 | 7 | 3 | 5 |
6 | -1 | 6 | -1 | -1 |
7 | -1 | 6 | -1 | -1 |
代码如下: |
package 有穷自动机;
import java.util.ArrayList;
import java.util.Scanner;
public class Automatic {
public static void main(String[] args)
{
String inpu=new String();
int state[][]=new int[7][4];
int over[]=new int[]{6,7};
int flag=0;
Scanner input=new Scanner(System.in);
System.out.println("欢迎使用DFA");
state[0]=new int[]{3,2,-1,-1};
state[1]=new int[]{4,2,-1,-1};
state[2]=new int[]{-1,6,3,5};
state[3]=new int[]{-1,7,3,5};
state[4]=new int[]{4,-1,-1,-1};
state[5]=new int[]{-1,6,-1,-1};
state[6]=new int[]{-1,6,-1,-1};
System.out.println("请输入‘输入符号串’");
inpu=input.nextLine();
int character[]=new int[100];
int index=0;
System.out.println("输入字符串是"+inpu);
//ArrayList<String> arr=new ArrayList<String>();
//arr.add(inpu);
String arr[]=inpu.split("");
for(String s:arr)
{
if(s.contains("a"))
{
character[index]=0;
}
else if(s.contains("b"))
{
character[index]=1;
}
else if(s.contains("c"))
{
character[index]=2;
}
else if(s.contains("d"))
{
character[index]=3;
}
System.out.println(""+s+index+character[index]);
index=index+1;
}
int p=0;
for(int k=0;k<inpu.length();k++)
{
int temp=character[k];
System.out.println("当前循环次:"+k);
System.out.println("行下标"+p);
System.out.println("列下标:"+temp);
System.out.println("下一个状态:"+state[p][temp]);
if(state[p][temp]<0)
{
System.out.printf("状态转换失败");
flag=1;
break;
}
else
{
p=state[p][temp]-1;
}
//System.out.println(""+p);
}
if(flag==1)
{
System.out.println("此次输入的字符串不是本有穷自动机的可用字符串");
}else{
if(p+1==6||p+1==7)
{
System.out.println("此次输入的字符串符号识别成功");
}
}
}
}
喜欢请给作者一个关注~谢谢!