算法:从NFA构造DFA(子集法)
输入: 一个NFA N
输出 : 一个接受同一正规集的DFA D
# 构造NFA
class NFA:
# 初始化NFA
def __init__(self, S, s0, F, move):
self.S = S # 状态集(list)
self.s0 = s0 # 初态(int)
self.F = F # 终态(int)
self.move = move # 状态转换函数(list套dict)
# 计算状态集T的n(代替ε)闭包U
def getClosure(self, T):
U = list() # 闭包集合
Stack = list() # 栈
for t in T:
Stack.append(t) # 将t入栈
U.append(t) # 先将T加入U
# 当栈非空
while Stack:
t = Stack.pop() # 取出栈顶元素
# 如果能转换(判断字典中是否存在key为'n')
if 'n' in move[t]:
u = self.move[t]['n'] # 得到转换后状态u
# 若转换后状态不在闭包集合U中,加u入U
if u not in U:
# 因为u为list类型,所以循环加入
for x in u:
Stack.a