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

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

?? remanage.cpp

?? 編譯課程設計
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// REManage.cpp: implementation of the REManage class.
//
//////////////////////////////////////////////////////////////////////
#pragma warning(disable:4786)

#include "REManage.h"
#include <iostream>
#include <fstream>
#include <algorithm>
#include <stack>
#include <windows.h>

using namespace std;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

REManage::REManage()
{
	out.open("Result.txt");
	this->state=1;
	this->isREUpdate=false;
	this->isNFAUpdate=false;
	this->isDFAUpdate=false;
}	
REManage::REManage(string re)
{
	this->state=1;
	this->re=re;
	this->isREUpdate=true;
}	
REManage::~REManage()
{	
}
void REManage::MakeNFA_S(char input,NFA* n,vector<EDGE>& edge)
{
	EDGE e;
	if(n->start==0&&n->end==0)
	{
		e.start=n->start=state;
		e.input=input;
		e.end=n->end=++state;
		
		state++;
	}
	else
	{
		e.start=n->start;
		e.input=input;
		e.end=n->end;
	}
	
	edge.push_back(e);
}
void REManage::MakeNFA_OR(NFA* result,NFA* left,NFA* right,vector<EDGE>& edge)
{
	NFA temp;
	result->start=temp.start=state;
	temp.end=left->start;
	MakeNFA_S('@',&temp,edge);	
	
	temp.start=state;
	temp.end=right->start;
	MakeNFA_S('@',&temp,edge);
	
	temp.start=left->end;
	temp.end=++state;
	MakeNFA_S('@',&temp,edge);
	
	temp.start=right->end;
	result->end=temp.end=state;
	MakeNFA_S('@',&temp,edge);
	
	state++;
}
void REManage::MakeNFA_AND(NFA* result,NFA* left,NFA* right,vector<EDGE>& edge)
{
	result->start=left->start;
	result->end=right->end;
	
	for(int i=0;i<edge.size();i++)
	{
		if(edge[i].start==right->start)
		{
			edge[i].start=left->end;
		}
	}
}
void REManage::MakeNFA_CL(NFA* result,NFA* op,vector<EDGE>& edge)
{
	NFA temp;
	result->start=temp.start=state;
	temp.end=op->start;
	MakeNFA_S('@',&temp,edge);
	
	temp.start=op->end;
	result->end=temp.end=++state;
	MakeNFA_S('@',&temp,edge);
	
	temp.start=op->end;
	temp.end=op->start;
	MakeNFA_S('@',&temp,edge);
	
	temp.start=result->start;
	temp.end=result->end;
	MakeNFA_S('@',&temp,edge);
	
	state++;	
}
int REManage::type(char re)
{
	if(re=='*'||re=='|')
		return OP;
	else if(re!='('&&re!=')')
		return OP_D;
	else
		return -1;
}

void REManage::ProcessREToNFA()
/*
===================
輸入:
	  re
	  REInput
===================
輸出:
	  NFA_EDGE
	  NFAInput
	  startNFA
	  endNFA
===================
*/
{
	stack<char> st;			//操作符堆棧,保存處理過程中遇到的操作符
	stack<NFA> sNFA;		//NFA堆棧,保存處理過程中產生的NFA

	NFA nfa,temp;
	NFA result;				//臨時變量

	/**************************Process RE***********************/
	for(int i=0;i<re.length();i++)
	{
		if(re[i]=='(')
		{
			st.push(re[i]);
		}
		else if(type(re[i])==OP_D)
		{
			/************Get input of RE************/
			if(find(REInput.begin(),REInput.end(),re[i])==REInput.end())
				REInput.push_back(re[i]);	
			/******************End*******************/

			nfa.start=0;
			nfa.end=0;
			MakeNFA_S(re[i],&nfa,NFA_EDGE);

			sNFA.push(nfa);
			if(sNFA.size()>=2)
			{
				if(st.size()>0&&st.top()=='|')
				{
					st.pop();
					
					temp=sNFA.top();
					sNFA.pop();
					nfa=sNFA.top();
					sNFA.pop();
					
					MakeNFA_OR(&result,&nfa,&temp,NFA_EDGE);
					sNFA.push(result);
				}
				else if(i>0&&re[i-1]!='(')
				{
					temp=sNFA.top();
					sNFA.pop();
					nfa=sNFA.top();
					sNFA.pop();
					
					MakeNFA_AND(&result,&nfa,&temp,NFA_EDGE);
					sNFA.push(result);
				}
			}
		}
		else if(type(re[i])==OP)
		{
			if(re[i]=='*')
			{
				nfa=sNFA.top();
				sNFA.pop();
				MakeNFA_CL(&result,&nfa,NFA_EDGE);
				sNFA.push(result);
			}
			else if(re[i]=='|')
			{
				st.push(re[i]);
			}
		}
		else if(re[i]==')')
		{
			st.pop();
			if(sNFA.size()>=2)
			{	
				temp=sNFA.top();
				sNFA.pop();
				nfa=sNFA.top();
				sNFA.pop();
				
				MakeNFA_AND(&result,&nfa,&temp,NFA_EDGE);
				sNFA.push(result);
			}
		}
	}
	/*******************************End*********************************/

	/****************Get start and end state of NFA************/
	if(sNFA.size()>0)
	{
		startNFA.push_back(sNFA.top().start);
		endNFA.push_back(sNFA.top().end);

	}
	/**************************End**************************/

}

void REManage::Find_NULL_Closure(vector<int> input, 
								 vector<int>&output,
								 vector<EDGE> edge)
{
	stack<int> state;

	output.clear();

	sort(input.begin(),input.end());

	for(int i=0;i<input.size();i++)
		state.push(input[i]);
	int temp=0;

	while(state.size()>0)
	{		
		output.push_back(state.top());
		temp=state.top();
		state.pop();
		for(int j=0;j<NFA_EDGE.size();j++)
			if(edge[j].start==temp&&edge[j].input=='@')
				state.push(edge[j].end);
	}

	sort(output.begin(),output.end());
}

void REManage::Move(vector<int> input,char in,vector<int>&result,vector<EDGE> edge)
{
	vector<int> temp;
	temp.clear();
	result.clear();
	
	for(int i=0;i<input.size();i++)
	{
		for(int j=0;j<edge.size();j++)
			if(edge[j].start==input[i]&&edge[j].input==in)
				temp.push_back(edge[j].end);
	}
	
	Find_NULL_Closure(temp,result,edge);
}

void REManage::ProcessNFAToDFA()
/*
===================
輸入:
	  NFA_EDGE
	  NFAInput
	  startNFA
	  endNFA
===================
輸出:
	  startDFA
	  endDFA
	  nonEndDFA
	  DFA_EDGE
	  DFAStateGather
===================
*/
{
	EDGE edge;				//臨時變量
	vector<int> DFAState;	//臨時變量,保存某一狀態集

	//vector<int> start;		//開始狀態集,實際只有一個元素
	int	over=-1;			//標記已處理過的狀態集


	//由NFA得到初始狀態集
	Find_NULL_Closure(startNFA, DFAState,NFA_EDGE);

	DFAStateGather.push_back(DFAState);
	startDFA=DFAStateGather.size()-1;	//得到初始狀態
	
	/*=========================add=========================*/
	for(int m=0;m<endNFA.size();m++)
	{
		if(find(DFAState.begin(),DFAState.end(),endNFA[m])!=DFAState.end())
			break;
	}
	
	if(m<endNFA.size())
		endDFA.push_back(DFAStateGather.size()-1);
	else
		nonEndDFA.push_back(DFAStateGather.size()-1);
	/*=========================add=========================*/

	/*****************Process NFA**********************/
	queue<vector<int> > tempState;
	tempState.push(DFAState);
	vector<vector<int> >::iterator iter;
	while(tempState.size()>0)
	{
		over++;

		edge.start=find(DFAStateGather.begin(),DFAStateGather.end(),
				tempState.front())-DFAStateGather.begin();

		for(int i=0;i<NFAInput.size();i++)
		{
			//求隊列首狀態集在輸入為input[i]時的結果狀態
			Move(tempState.front(),NFAInput[i],DFAState,NFA_EDGE);	
			if(DFAState.size()<1)
				break;
			//填充DFA的邊					
			edge.input=NFAInput[i];
			
			iter=find(DFAStateGather.begin(),DFAStateGather.end(),DFAState);
			
			//如果所產生的狀態集不在DFAStateGather中,則保存該狀態集
			if(iter==DFAStateGather.end())
			{	
				DFAStateGather.push_back(DFAState);
				
				/*=========================add=========================*/
				for(int m=0;m<endNFA.size();m++)
				{
					if(find(DFAState.begin(),DFAState.end(),endNFA[m])!=DFAState.end())
						break;
				}
				
				if(m<endNFA.size())
					endDFA.push_back(DFAStateGather.size()-1);
				else
					nonEndDFA.push_back(DFAStateGather.size()-1);
				/*=========================add=========================*/

				edge.end=DFAStateGather.size()-1;	
			}
			else
				edge.end=iter-DFAStateGather.begin();
			//保存邊
			DFA_EDGE.push_back(edge);

			if(DFAState!=tempState.front()&&edge.end>over)
				tempState.push(DFAState);
		}
		tempState.pop();
	}
	/*************************End*******************************/
}

/*消除DFA中的無用狀態*/
void REManage::RemoveFutility()
/*
===================
輸入:
	  miniStartDFA
	  miniEndDFA
      miniNonEndDFA
	  MiniDFA_EDGE
	  miniStateGather
===================
輸出:
	  miniStartDFA
	  miniEndDFA
      miniNonEndDFA
	  MiniDFA_EDGE
	  miniStateGather	  
===================
*/
{

	vector<int>	reachedState;
	queue<int>	reached;

	vector<int> startGather;
	vector<int>	endGather;

	reachedState.clear();	


	/****************Generate reached state*******************/
	reached.push(miniStartDFA);
	reachedState.push_back(miniStartDFA);

	while(reached.size()>0)
	{
		int front=reached.front();
		reached.pop();

		for(int i=0;i<MiniDFA_EDGE.size();i++)
		{
			if(find(DFAInput.begin(),DFAInput.end(),MiniDFA_EDGE[i].input)
				==DFAInput.end())
				DFAInput.push_back(MiniDFA_EDGE[i].input);

			if(MiniDFA_EDGE[i].start==front)
			{
				if(find(reachedState.begin(),reachedState.end(),MiniDFA_EDGE[i].end)
					==reachedState.end())
				{
					reachedState.push_back(MiniDFA_EDGE[i].end);
					reached.push(MiniDFA_EDGE[i].end);
				}
			}
		}
	}
	sort(reachedState.begin(),reachedState.end());
	/*****************************end******************************/

	/****************Update the edge of DFA*******************/
	vector<EDGE>::iterator iterEDGE;
	
	for(int i=0;i<MiniDFA_EDGE.size();i++)
	{
		if(find(reachedState.begin(),reachedState.end(),MiniDFA_EDGE[i].start)
			==reachedState.end())
		{
			iterEDGE=MiniDFA_EDGE.begin()+i;
			MiniDFA_EDGE.erase(iterEDGE++);
			i--;
		}
	}
	/*****************************end******************************/

	/****************Update the end state of DFA*******************/
	vector<int>::iterator iterEnd;
	for(i=0;i<miniEndDFA.size();i++)
	{
		if(find(reachedState.begin(),reachedState.end(),miniEndDFA[i])
			==reachedState.end())
		{
			iterEnd=miniEndDFA.begin()+i;
			miniEndDFA.erase(iterEnd++);
			i--;
		}
	}
	/*****************************end******************************/
	
	/******************remove not end state************************/	
	int initSize=reachedState.size()+1;

	while(reachedState.size()<initSize)
	{
		initSize=reachedState.size();

		startGather.clear();
		endGather.clear();

		for(int m=0;m<MiniDFA_EDGE.size();m++)
		{
			if(find(startGather.begin(),startGather.end(),MiniDFA_EDGE[m].start)
				==startGather.end())
				startGather.push_back(MiniDFA_EDGE[m].start);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
婷婷激情综合网| 色狠狠桃花综合| 久久爱www久久做| 丝袜亚洲另类丝袜在线| 最近中文字幕一区二区三区| 国产午夜精品久久| 中文字幕成人在线观看| 久久先锋影音av| 久久亚洲精华国产精华液 | 成人激情动漫在线观看| 激情综合色综合久久| 久久激情五月婷婷| 免费久久精品视频| 激情欧美一区二区| 国产乱子伦一区二区三区国色天香| 欧美a级理论片| 美女在线一区二区| 激情五月播播久久久精品| 狠狠色狠狠色综合系列| 国产一区二区女| 国产激情一区二区三区四区| 成人永久免费视频| 91亚洲资源网| 欧美无乱码久久久免费午夜一区| 欧美美女网站色| 欧美一级黄色片| 精品捆绑美女sm三区| 国产亚洲欧美色| 亚洲色图一区二区三区| 亚洲影视在线播放| 日韩电影在线免费观看| 老司机精品视频线观看86| 国产成人精品免费在线| 9人人澡人人爽人人精品| 91成人在线免费观看| 91精品国产综合久久国产大片| 久久久久久久久久久黄色| 中文字幕一区视频| 午夜视频久久久久久| 国产精品夜夜嗨| 97精品视频在线观看自产线路二| 欧美视频一区在线| 久久午夜羞羞影院免费观看| 亚洲人成人一区二区在线观看 | 亚洲午夜精品网| 六月丁香综合在线视频| 成人小视频免费在线观看| 在线亚洲一区二区| 26uuu成人网一区二区三区| 国产精品短视频| 青青草国产成人av片免费| 国产精品一区二区无线| 欧美优质美女网站| 精品国产91乱码一区二区三区 | 国产精品美女久久久久久2018| 亚洲一区二区四区蜜桃| 国产剧情一区二区三区| 在线观看日韩国产| 久久精品夜色噜噜亚洲aⅴ| 亚洲在线中文字幕| 国内外成人在线| 欧美三级电影网站| 日本一区二区高清| 青青草国产精品97视觉盛宴| av在线一区二区| 欧美成人a在线| 亚洲一区在线观看免费观看电影高清 | 91精品国产麻豆国产自产在线| 国产女人aaa级久久久级| 丝袜诱惑制服诱惑色一区在线观看| 顶级嫩模精品视频在线看| 7777精品伊人久久久大香线蕉经典版下载| 久久噜噜亚洲综合| 开心九九激情九九欧美日韩精美视频电影 | 亚洲一区在线观看网站| 成人免费av在线| 日韩免费高清av| 亚洲影院在线观看| 99久久er热在这里只有精品66| 中文字幕乱码久久午夜不卡| 欧美精品一区二区三区很污很色的| 一区二区免费看| 国产jizzjizz一区二区| 精品国产青草久久久久福利| 亚洲电影视频在线| 一本久道久久综合中文字幕| 国产欧美精品在线观看| 久草中文综合在线| 91精品国产一区二区三区蜜臀| 亚洲精品伦理在线| 91亚洲国产成人精品一区二三 | 亚洲天堂福利av| 成人av资源在线| 国产日产欧美精品一区二区三区| 美女高潮久久久| 欧美一区二区三区在线电影| 亚洲综合色网站| 欧洲视频一区二区| 一区二区三区在线影院| 97久久久精品综合88久久| ●精品国产综合乱码久久久久| 成人av综合在线| 中文字幕一区二区三区乱码在线| 成人av手机在线观看| 中文字幕一区日韩精品欧美| 成人精品视频一区二区三区尤物| 国产网站一区二区| av在线不卡网| 中文字幕一区二区三区蜜月| av一区二区三区四区| 国产精品国产馆在线真实露脸| 成人理论电影网| 国产精品国产a| 91蜜桃在线免费视频| 亚洲精品视频在线| 欧美午夜影院一区| 日韩精品成人一区二区在线| 欧美精品少妇一区二区三区| 日韩精品久久久久久| 欧美成人一区二区三区| 韩国三级在线一区| 久久精品在线观看| 波多野结衣在线一区| 亚洲人精品午夜| 欧美日韩一区高清| 麻豆精品一区二区综合av| 精品少妇一区二区三区日产乱码 | 国产一区二区精品久久| 久久免费偷拍视频| 播五月开心婷婷综合| 依依成人精品视频| 91精品久久久久久久91蜜桃| 国产一区不卡视频| 国产精品家庭影院| 欧美性受xxxx黑人xyx| 老司机免费视频一区二区| 欧美国产一区二区在线观看| 色婷婷国产精品| 日本不卡一区二区三区高清视频| 久久综合国产精品| 97精品久久久久中文字幕 | 久久99精品国产.久久久久久 | 亚洲五码中文字幕| 欧美大片日本大片免费观看| 国产成人在线电影| 亚洲国产欧美在线| 精品成人一区二区三区四区| 不卡的av中国片| 欧美aaaaa成人免费观看视频| 日本一区二区三区视频视频| 欧美在线观看视频在线| 久久99九九99精品| 一区二区三区在线观看欧美 | 一区二区三区四区在线免费观看 | 最新欧美精品一区二区三区| 欧美二区三区91| 91在线一区二区| 久久99深爱久久99精品| 中文字幕亚洲欧美在线不卡| 欧美军同video69gay| 成人深夜视频在线观看| 五月天久久比比资源色| 久久久一区二区| 国产91高潮流白浆在线麻豆 | av高清不卡在线| 老鸭窝一区二区久久精品| 久久影院电视剧免费观看| 在线观看国产一区二区| 国产成人综合亚洲91猫咪| 亚洲一区二区在线视频| 国产日韩欧美电影| 欧美伊人久久久久久久久影院| 国产高清成人在线| 日韩高清电影一区| 国产精品素人一区二区| 欧美成人性福生活免费看| 91看片淫黄大片一级在线观看| 久久国产人妖系列| 国产精品福利电影一区二区三区四区| 制服.丝袜.亚洲.中文.综合| 色天天综合色天天久久| 国产在线日韩欧美| 日产精品久久久久久久性色| 久久久久久久网| 欧美大片拔萝卜| 91精品国产91久久久久久最新毛片 | 欧美一级欧美三级| 91精彩视频在线| 精品一区二区三区免费毛片爱| 亚洲成人精品一区| 一级做a爱片久久| 国产精品午夜在线| 久久老女人爱爱| 欧美日韩精品系列| 在线区一区二视频| 91香蕉视频在线| 丁香婷婷综合色啪| 国产不卡视频一区| 免费人成精品欧美精品| 亚洲午夜在线电影|