博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python实现DFA模拟程序(附java实现代码)
阅读量:5265 次
发布时间:2019-06-14

本文共 3356 字,大约阅读时间需要 11 分钟。

DFA(确定的有穷自动机)

一个确定的有穷自动机M是一个五元组:

M=(K,∑,f,S,Z)
  1. K是一个有穷集,它的每个元素称为一个状态。
  2. ∑是一个有穷字母表,它的每一个元素称为一个输入符号,所以也陈∑为输入符号表。
  3. f是转换函数,是Kx∑->K上的映象。
  4. S∈K,是唯一的一个初态。
  5. Z∈K,是一个终态集,终态也称可接受状态或结束状态。

实例代码

  1. 实现文法
G[S]:   S->aU|bVU->bV|aQQ->aQ|bQ
  1. 状态图

    1561653-20190601095737250-1009451617.jpg

  2. 代码实现

-*- coding: utf-8 -*- ##@author: chlinlearn#@createTime: 2019/4/13 14:12#@fileName: DFAclass DFA():    def __init__(self):        #状态集        self.listEdge = []        #初态        self.S = []        #终态        self.Z = []    #判断是否是终态集    def isZ(self,ch):        for i in range(0,len(self.Z)) :            if self.Z[0] == ch or self.Z[1] == ch:                return True            else:                return False    #输入    def input(self):        self.S = input("请输入开始符:")        self.Z = input("请输入终态集(终集符组成的一个字符串):")        self.Z = self.Z.split(",")        print("请输入正规文法以exit结尾:")        print("example:S,aZ")        while(True):            list = []            inStr = input()            if inStr=='exit':                break            inStr = inStr.split(',')            # 读取第一个状态集            s = inStr[0]            for i in range(0,len(inStr[1])):                #ch,ns                if len(inStr[1])==2:                    c = inStr[1][0]                    n = inStr[1][1]                    list = [s,c,n]                    self.listEdge.append(list)                elif len(inStr[1])==1:                    c = inStr[1][0]                    list = [s, c, self.Z[0]]                    self.listEdge.append(list)    #转换函数    def isNextState(self,s,ch):        for i in range(0,len(self.listEdge)):            if s == self.listEdge[i][0] and ch == self.listEdge[i][1]:                return self.listEdge[i][2]        return    def judgeDFA(self):        print("请输入要判断的字符串:")        while(True):            #获取字母表            str = input()            if '#' in str :                print("程序已退出,欢迎下次使用!")                return            temp = self.S[0]            for i in range(0,len(str)):                if str[i] is 'a':                    temp = self.isNextState(temp,'a')                elif str[i] is 'b':                    temp = self.isNextState(temp, 'b')                else:                    break            if self.isZ(temp):                print("此字符串“属于”该文法!")            else:                print("此字符串“不属于”该文法!")            print("再次判断请输入字符串(退出程序输入#):")if __name__ == '__main__':    DFA = DFA()    DFA.input()    DFA.judgeDFA()

总结

这是我在课程中的一个实验,代码手写并且可运行,是参照一个java版的代码实现的,加上自己的理解和思路把它以python的形式实现。学习别人好的地方,当然也不能照搬别人,不然能够为己用的东西少之又少。通过不同的编程语言把整个思路在理一遍能够加深自己的理解,并且能够得到一样的运行结果,说明自己的理解是对的。最后也附上对应的java版代码,有需求的童鞋可以参考喔!

欢迎访问我的个人网站

附件

java版DFA

import java.util.ArrayList;import java.util.List;import java.util.Scanner;class edge {        char PriorityState;    char ch;     char NextState;    edge(char p,char c, char n){        PriorityState = p;        ch = c;        NextState = n;    }    @Override    public String toString() {        return "edge [PriorityState=" + PriorityState + ", ch=" + ch + ", NextState=" + NextState + "]";    }}/**DFA的构造*/public class DFA {    static List
listEdge = new ArrayList
();//状态集 //static HashMap
mapEdge = new HashMap<>(); static String S;//初态集 static String Z;//终态集 //flag is here static boolean judeZ(char ch){ for(int j=0; j

转载于:https://www.cnblogs.com/chlinlearn/p/10958653.html

你可能感兴趣的文章
Java 序列化
查看>>
Java 时间处理实例
查看>>
Java 多线程编程
查看>>
Java 数组实例
查看>>
mysql启动过程
查看>>
2017前端面试题总结
查看>>
Http GetPost网络请求
查看>>
SWIFT国际资金清算系统
查看>>
Sping注解:注解和含义
查看>>
站立会议第四天
查看>>
如何快速掌握一门技术
查看>>
利用AMPScript获取Uber用户数据的访问权限
查看>>
vagrant 同时设置多个同步目录
查看>>
python接口自动化28-requests-html爬虫框架
查看>>
生成随机数的模板
查看>>
Mysql 数据库操作
查看>>
转:linux终端常用快捷键
查看>>
A-Softmax的总结及与L-Softmax的对比——SphereFace
查看>>
UVa 11059 最大乘积
查看>>
数组分割问题求两个子数组的和差值的小
查看>>