亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? confirmnfa.java

?? 本程序是編譯原理的經典試驗
?? JAVA
?? 第 1 頁 / 共 2 頁
字號:
/**
 * 基于狀態轉換矩陣表示的FA確定化、最小化并給出有限自動機的通用實現
 * @author Skypia0000
 *
 */

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

@SuppressWarnings(value = {"unchecked"})
public class ConfirmNFA {
	private String matrix_NFA[][];					/* 存放待確定化的非確定有限自動機的狀態轉換矩陣 */
	private String matrix_DFA[][];					/* 存放確定化后的狀態轉換矩陣 */
	private char input_SYM[];						/* 存放輸入符號,初始符號集包含e(在數組尾端),確定化之后去掉e,長度減1 */
	private char endStatus_NFA[];				/* 存放NFA的終態集 */
	private String end_Status;

	private ArrayList c_Group;						/* 存放根據NFA構造出來的C子集 */

	private int len_SYMS;							/* 存放輸入符號長度,input_SYM數組的長度 */
	private int len_ENDSTNFA;					/* 存放NFA終態集的長度,endStatus_NFA數組的長度 */
	private int row_NFA, col_NFA;				/* 存放最初NFA狀態轉換矩陣(matrix_NFA)的行數及列數,其中col_NFA比實際矩陣列數小1  */
	private int index_CGroup;						/* 存放在c_Group中游走的下標 */
	private int counter;								/* 子集中的狀態計數器 */
	private int row_DFA, col_DFA;				/* 存放確定化之后的狀態轉換矩陣(matrix_DFA)行數及列數,其中col_DFA比實際矩陣列數小1*/

	/**
	 * DFA的最小化
	 * 思想:
	 * 1.首先去掉無用狀態: a.任何狀態都不能到達的狀態 b.從這個狀態沒有通路到達終態
	 * 2.合并等價狀態:
	 * 		a.一致性條件:狀態s和狀態t必須同時為可接受狀態(初態)或不可接受狀態(終態)
	 * 		b.蔓延性條件:對以所有輸入符號,狀態s和狀態t必須轉換到等價的狀態里
	 */
	public void miniDFA() {
		String start = "", end = "";					/* start為初態集,end為終態集 */
		boolean isUniform = true;
		ArrayList strOnly;								/* 存放P集合,與p_Group不同之處是只存放字符串,兒p_Group存放PStatus對象 */

		removeExcrescent();							/* 刪除無用狀態,未完全實現 */
		strOnly = divide();								/* 分割成初態集和終態集的列表 */
		start = strOnly.get(0).toString();			/* 初態集賦值 */
		end = strOnly.get(1).toString();			/* 終態集賦值 */

		/*
		 * 從狀態0開始與之后的每一個狀態進行匹配,如果有等價狀態則合并狀態
		 * 將與當前狀態等價的狀態
		 */
		while(isUniform) {
			for(int i = 0; i < row_DFA; i++) {						/* 當前狀態循環 */
				if(!matrix_DFA[i][0].equals("@")) {					/* 如果該狀態被合并,則跳過此狀態,繼續下一個狀態 */
					for(int j = i + 1; j < row_DFA; j++) {			/* 尋找與當前狀態等價的狀態的循環 */
						if(!matrix_DFA[j][0].equals("@")) {			/* 如果該狀態已被合并,則跳過此狀態,繼續下一個狀態 */
							String first = matrix_DFA[i][1];			/* 獲取當前狀態在第一個輸入符號下的跳轉狀態 */
							String next = matrix_DFA[j][1];			/* 獲取待匹配狀態在第一個輸入符號下的跳轉狀態 */
							/* 當前狀態和待匹配狀態的首個輸入符號下的跳轉狀態相同,當前狀態和待匹配狀態在同一個集合中(可接受或不可接受)*/
							if(first.equals(next) && ((start.contains(first) && start.contains(next)) || (end.contains(next) && end.contains(next)))) {//bug
								isUniform = true;
								for(int k = 2; k <= col_DFA; k++) {	/* 接續判斷之后所有輸入符號下跳轉狀態是否相同*/
									String first2 = matrix_DFA[i][k];		
									String next2 = matrix_DFA[j][k];
									if(!first2.equals(next2)) {					/* 如果在同一個輸入符號下,跳轉狀態不相同,則放棄繼續到下一個狀態 */
										isUniform = false;
										break;
									}
								}
								if(isUniform) {									/* 如果所有輸入下跳轉狀態都相同,則合并,即對待匹配狀態進行標記 */
									for(int m = 0; m < row_DFA; m++) {
										for(int n = 1; n <= col_DFA; n++) {
											if(matrix_DFA[m][n].equals(matrix_DFA[j][0])) {
												matrix_DFA[m][n] = matrix_DFA[i][0];
											}
										}
									}
									matrix_DFA[j][0] = "@";					/* 對待匹配狀態進行標記 */
									continue;
								}
							}
						}
					}
				}
			}	
		}

		/* 確定最小化DFA終態 */
		for(int i = 0; i < row_DFA; i++) {
			if(matrix_DFA[i][0].equals("@")) {continue;}
			if(end.contains(matrix_DFA[i][0])) {
				end_Status = matrix_DFA[i][0];
				break;
			}
		}
	}
	/**
	 * 將狀態子集分割成初態集和終態集
	 */
	public ArrayList divide() {
		String sStatus = "";								/* 初態集 */
		String eStatus = "";								/* 終態集 */
		ArrayList arrayList = new ArrayList();

		for(int i = 0; i < c_Group.size(); i++) {		/* 對C子集的每個元素(確定化之后的狀態集)進行檢測 */
			if(!((ClosureStatus)c_Group.get(i)).getST().equals("@")) {		/* 如果該狀態不是無用狀態,繼續執行 */
				int j;
				for(j = 0; j < len_ENDSTNFA; j++) {
					if(((ClosureStatus)c_Group.get(i)).getSTATUS().contains("" + endStatus_NFA[j])) {	/* 如果狀態集包含最初NFA的終態,則被加入到終態集 */
						eStatus += ((ClosureStatus)c_Group.get(i)).getST();			/* 將字符標記添加到終態集中 */
						break;
					}
				}
				if(j >= len_ENDSTNFA) {						/* 其余添加到初態集中 */
					sStatus += ((ClosureStatus)c_Group.get(i)).getST();
				}
			}
		}
		arrayList.add(sStatus);
		arrayList.add(eStatus);
		return arrayList;
	}
	/**
	 * 刪除無用狀態
	 * 用@做標記
	 */
	public void removeExcrescent() {
		for(int i = 1; i < row_DFA; i++) {
			if(!exit(matrix_DFA[i][0])) {
				matrix_DFA[i][0] = "@";
				((ClosureStatus)c_Group.get(i)).setST("@");
			}
		}
	}
	/**
	 * 判斷是否為無用狀態
	 * @param status
	 * @return
	 */
	public boolean exit(String status) {
		boolean exit = false;

		for(int i = 0; i < row_DFA; i++) {
			/* 檢查除自身以外的狀態  */
			if(!status.equals(matrix_DFA[i][0])) {
				for(int j = 1; j < col_DFA + 1; j++) {
					if(status.equals(matrix_DFA[i][j])) {
						exit = true;
						i = row_DFA;
						break;
					}
				}
			}
		}
		//haven't been completed..........
		if(exit) {

		}

		return exit;
	}

	/**
	 * 將確定化之后的狀態集用一個字符表示:0~9序列
	 */
	private void strToChar() {
		String moveStatus;							/* 存放子集成員在a輸入下的狀態轉換集 */
		String closureStatus;							/* 存放在moveStatus的閉包集 */
		row_DFA = c_Group.size();					/* 利用C子集族中的元素個數定義 */
		col_DFA = len_SYMS - 1;					/* 確定化之后去掉了輸入符號e,所以減1 */
		matrix_DFA = new String[row_DFA][col_DFA + 1];								/* + 1 是為了在每一行開頭存放狀態位 */

		for(int i = 0; i < c_Group.size(); i++) {/* 檢測所有狀態在所有輸入符號下的跳轉狀態,并重新構造狀態轉換矩陣 */
			ClosureStatus newCS = (ClosureStatus)c_Group.get(i);
			matrix_DFA[i][0] = newCS.getST();				/* 每一行開頭添加狀態標記 */
			String tempStr = newCS.getSTATUS();
			for(int j = 1; j <= col_DFA; j++) {
				moveStatus = move(tempStr, j, matrix_NFA);			/* 求狀態在J輸入下的跳轉狀態 */
				closureStatus = moveStatus;
				closureStatus = sort(removeEcho(closure(moveStatus, closureStatus, len_SYMS)));
				for(int k = 0; k < c_Group.size(); k++) {
					if(closureStatus.equals(((ClosureStatus)c_Group.get(k)).getSTATUS())) {
						matrix_DFA[i][j] = ((ClosureStatus)c_Group.get(k)).getST();
						break;
					}
				}
			}
		}
	}
	/**
	 * 將狀態集中的狀態從小到大排序
	 * @param str
	 * @return
	 */
	public String sort(String str){
		char[] s=str.toCharArray();
		String strs="";
		for(int i=0;i<str.length();i++) {
			char temp=s[str.length()-(1+i)];
			for(int j=str.length()-1;j>=1;j--){
				if(s[j]<s[j-1]){
					temp=s[j];
					s[j]=s[j-1];
					s[j-1]=temp;
				}
			}
		}
		for(int m=0;m<s.length;m++)
			strs+=s[m];
		return strs;
	}
	/**
	 * 刪除狀態集中重復的狀態
	 * @param str
	 * @return
	 */
	public String removeEcho(String str) {
		String tempStr = "";
		for(int i=0;i<str.length();i++){
			if(!tempStr.contains(String.valueOf(str.charAt(i)))) {
				tempStr+=String.valueOf(str.charAt(i));
			}
		}
		return tempStr;
	}
	/**
	 * 求一個狀態集在input輸入下的跳轉狀態

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产一区二区三区忘忧草| 中文字幕一区日韩精品欧美| 久久免费视频一区| 亚洲已满18点击进入久久| 久久超碰97人人做人人爱| 色综合久久九月婷婷色综合| 精品国产乱码久久| 日韩精品电影在线观看| 99re这里都是精品| 久久久久久久久久电影| 五月天亚洲精品| 在线观看日韩av先锋影音电影院| 精品国产一区二区精华| 午夜久久电影网| 欧美亚洲国产一区二区三区va| 国产精品福利一区| 国产盗摄一区二区| 亚洲精品在线一区二区| 日韩av一级电影| 欧美日韩一区精品| 一个色妞综合视频在线观看| 91在线观看下载| 国产女人18毛片水真多成人如厕| 久久99久久久欧美国产| 欧美一级欧美一级在线播放| 日韩激情av在线| 欧美一级xxx| 久99久精品视频免费观看| 欧美一区二区在线视频| 香港成人在线视频| 欧美日韩精品电影| 日韩精品欧美精品| 日韩精品一区二区三区在线| 免费在线一区观看| 精品国精品自拍自在线| 国内久久婷婷综合| 国产欧美日韩麻豆91| 成人夜色视频网站在线观看| 国产精品久久久久久久第一福利| 成人av小说网| 一区二区三区欧美日| 在线视频欧美精品| 丝袜亚洲另类丝袜在线| 欧美tickling挠脚心丨vk| 国产精品一品二品| 亚洲欧洲日韩一区二区三区| 色婷婷综合久久久久中文 | 91网页版在线| 亚洲综合丝袜美腿| 欧美丰满少妇xxxxx高潮对白| 日韩av在线发布| 久久久久青草大香线综合精品| 国产精品 欧美精品| 中文字幕日韩一区| 欧美三级电影一区| 蜜臂av日日欢夜夜爽一区| 久久久精品免费网站| 97se亚洲国产综合在线| 香蕉成人啪国产精品视频综合网 | 色综合天天天天做夜夜夜夜做| 亚洲精品成人少妇| 欧美一级二级三级蜜桃| 成人小视频在线观看| 亚洲激情网站免费观看| 日韩欧美aaaaaa| 成人免费毛片嘿嘿连载视频| 亚洲综合图片区| 亚洲精品在线电影| 色综合久久88色综合天天免费| 日韩二区三区在线观看| 中文字幕电影一区| 7777精品伊人久久久大香线蕉最新版| 韩国欧美一区二区| 亚洲国产精品精华液网站| 26uuu精品一区二区在线观看| 成人福利在线看| 日本欧美一区二区在线观看| 国产精品国产三级国产a| 欧美卡1卡2卡| 99久久精品国产毛片| 久久综合综合久久综合| 亚洲免费在线观看| 国产天堂亚洲国产碰碰| 91精品国产91综合久久蜜臀| 成人免费高清在线| 麻豆精品视频在线观看免费| 亚洲精品你懂的| 国产视频不卡一区| 日韩欧美亚洲另类制服综合在线| 在线一区二区三区四区五区 | 蜜臀av一区二区| 亚洲伦理在线精品| 国产欧美日韩亚州综合| 精品国产污网站| 91精品免费观看| 欧美视频在线播放| 色婷婷国产精品久久包臀| 成人综合激情网| 国产成人免费视频网站| 九九热在线视频观看这里只有精品| 亚洲综合一区在线| 樱花影视一区二区| 亚洲精品国产a| 亚洲男人的天堂网| 亚洲蜜臀av乱码久久精品蜜桃| 日本一区二区高清| 日本一区二区三区电影| 久久久另类综合| 久久综合九色综合97婷婷| 日韩久久久久久| www一区二区| 欧美精品一区二区在线观看| 日韩精品最新网址| www一区二区| 欧美tickling网站挠脚心| 日韩欧美国产午夜精品| 精品蜜桃在线看| 精品美女一区二区三区| 欧美精品一区在线观看| 久久色视频免费观看| 久久亚洲精品国产精品紫薇| 久久久久国产精品人| 久久久影视传媒| 国产精品你懂的| 伊人色综合久久天天人手人婷| 亚洲另类春色校园小说| 亚洲一区二区三区四区五区黄 | 欧美日韩日日摸| 欧美日韩国产首页| 欧美性大战久久久久久久蜜臀| 日本高清无吗v一区| 91精品在线免费| 26uuu亚洲综合色| 国产精品久久久久久久裸模| 亚洲精选一二三| 天堂av在线一区| 国产成人夜色高潮福利影视| 99久久精品免费观看| 欧美亚洲综合色| 精品乱人伦一区二区三区| 久久精品一区二区| 亚洲激情自拍视频| 美女在线一区二区| 99久久综合99久久综合网站| 一道本成人在线| 欧美成人三级在线| 国产精品国产精品国产专区不蜜 | 精品88久久久久88久久久| 国产精品毛片久久久久久久| 一区二区三区日韩精品视频| 免费久久99精品国产| 不卡一区二区三区四区| 欧美福利视频一区| 国产精品久久久久久久久久免费看| 亚洲已满18点击进入久久| 国产精品亚洲一区二区三区妖精| 99久免费精品视频在线观看 | 国产精品福利一区二区| 日韩不卡手机在线v区| 国产宾馆实践打屁股91| 欧美猛男gaygay网站| 国产农村妇女精品| 青草国产精品久久久久久| 波多野结衣在线aⅴ中文字幕不卡| 4438x成人网最大色成网站| 中文字幕精品一区二区精品绿巨人| 午夜精品久久久久| 91天堂素人约啪| 久久婷婷成人综合色| 日韩av中文字幕一区二区三区| www.日韩精品| 2023国产精品| 日韩高清一级片| 日本韩国欧美国产| 国产精品毛片久久久久久久| 国产真实乱偷精品视频免| 欧美色中文字幕| 亚洲欧美经典视频| caoporn国产一区二区| 亚洲精品一区二区三区影院| 亚洲国产wwwccc36天堂| 91麻豆swag| 成人免费一区二区三区在线观看| 欧美视频一区二| 国产精品久久久久久久久快鸭| 国精产品一区一区三区mba桃花| 777奇米四色成人影色区| 亚洲一区二区三区四区的| 一本大道久久精品懂色aⅴ| 国产亚洲1区2区3区| 美国欧美日韩国产在线播放| 欧美日韩成人高清| 午夜精品aaa| 欧美精品日日鲁夜夜添| 亚洲小说春色综合另类电影| 欧美无乱码久久久免费午夜一区| 亚洲欧美激情视频在线观看一区二区三区| 国产成人精品午夜视频免费| 日本一区二区三区四区 | 日韩电影在线观看电影|