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

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

?? cpp1.cpp

?? 構造nfa及到DFA的轉換 構造nfa及到DFA的轉換
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <conio.h>
#include <string>

using namespace std; 


/////////////////////////////////////////////////

#define NULL 0
#define LStack LinkedStack

/////////////////////////////////////////////////

// 鏈式棧類的前視定義
template <class T>
class LinkedStack;

/////////////////////////////////////////////////

// 定義鏈式棧結點類
template <class T>
class StackNode
{
	friend class LinkedStack<T>;
	private:
		T data;
        StackNode<T> *next;
		StackNode(T item = 0, StackNode<T> *p = NULL)
		{
			data = item;
			next = p;
		}
};

/////////////////////////////////////////////////

// 定義鏈式棧類
template <class T>
class LinkedStack
{
	private:
		StackNode<T> *top;
	public:
		LinkedStack();
		~LinkedStack();
		bool IsEmpty(void) const;
		int Length(void) const;
		void Push(const T &item);
		T Pop(void);
		T GetTop(void);
		void Clear(void);
};
// 構造函數
template <class T>
LinkedStack<T>::LinkedStack()
{
	top = NULL;
}
// 析構函數
template <class T>
LinkedStack<T>::~LinkedStack()
{
	Clear();
}
// 判斷棧是否為空
template <class T>
bool LinkedStack<T>::IsEmpty(void) const
{
	return (! top);
}
// 獲取隊列的長度
template <class T>
int LinkedStack<T>::Length(void) const
{
	StackNode<T> *temp = new StackNode<T>();
	temp = top;
	int length = 0;
	while (temp)
	{
		temp = temp->next;
		length++;
	}
	return length;
}
// 壓入數據(入棧)
template <class T>
void LinkedStack<T>::Push(const T &item)
{
	top = new StackNode<T>(item, top);
}
// 抽出數據(出棧)
template <class T>
T LinkedStack<T>::Pop(void)
{
	if (! IsEmpty())
	{
	    StackNode<T> *temp = top;
		top = top->next;
		T value = temp->data;
		delete temp;
		return value;
	}
	else
	{
		cout << "Stack Already Empty!" << endl;
		getch();
		exit(1);
	}
}
// 獲取棧頭數據
template <class T>
T LinkedStack<T>::GetTop(void)
{
	if (! IsEmpty())
	{
		return top->data;
	}
	else
	{
		cout << "Stack Already Empty!" << endl;
		getch();
		exit(1);
	}
}
// 設置棧為空棧
template <class T>
void LinkedStack<T>::Clear(void)
{
	StackNode<T> *temp = new StackNode<T>();
	while (top)
	{
		temp = top;
		top = top->next;
		delete temp;
	}
}

/////////////////////////////////////////////////

// 定義鄰接表的邊表類
class Edge
{
	public:
		int number;
		int position;
		char weight;
		Edge *link;
		Edge();
		Edge(int num, int pos, char ch);
};
Edge::Edge()
{
	number = -1;
	position = -1;
	link = NULL;
}
Edge::Edge(int num, int pos, char ch)
{
	number = num;
	position = pos;
	weight = ch;
    link = NULL;
}

/////////////////////////////////////////////////

// 定義鄰接表的頂點類
class Vertex
{
	public:
		int number;
		Vertex *next;
		Edge *out;
		Vertex();
		Vertex(int num);
};
Vertex::Vertex()
{
	number = -1;
	next = NULL;
	out = NULL;
}
Vertex::Vertex(int num)
{
	number = num;
	next = NULL;
	out = NULL;
}

/////////////////////////////////////////////////

// 用鄰接表定義的圖類
class AdjacentTable
{
	private:
		Vertex *startVertex;
		int numOfVertices;
		int numOfEdges;
	public:
		AdjacentTable();
		~AdjacentTable();
		int GetValueByPos(int pos) const;
		int GetPosByValue(int value) const;
		char GetWeightByPos(int v1, int v2) const;
		char GetWeightByValue(int value1, int value2) const;
		void SetValue(int value, int pos);
		void InsertVertex(int value);
		void InsertEdgeByPos(int v1, int v2, char weight);
		void InsertEdgeByValue(int value1, int value2, char weight);
		void RemoveAllEdges(void);
		void Clear(void);
		int* Closure(int *T);
		int* Move(int *T, char ch);
		void OutputNFA(void);
};
// 構造函數
AdjacentTable::AdjacentTable()
{
	numOfVertices = 1;
	numOfEdges = 0;
	startVertex = new Vertex();
}
// 析構函數
AdjacentTable::~AdjacentTable()
{
	Vertex *p;
	Edge *q;
	p = startVertex;
	for (int i=0; i<numOfVertices; i++)
	{
		q = p->out;
		while (q)
		{
			p->out = q->link;
			delete q;
			q = p->out;
		}
		p = p->next;
	}
}
// 按頂點位置獲取頂點的值
int AdjacentTable::GetValueByPos(int pos) const
{
	if ((pos >= 0) && (pos < numOfVertices))
	{
    	Vertex *p = startVertex;
    	for (int i=0; i<pos; i++)
		{
	    	p = p->next;
		}
		return p->number;
	}
	return -1;
}
// 按頂點值獲取頂點的位置
int AdjacentTable::GetPosByValue(int value) const
{
	Vertex *p = startVertex;
    for (int i=0; i<numOfVertices; i++)
	{
		if (p->number == value)
		{
			return i;
		}
	    p = p->next;
	}
	return -1;
}
// 按頂點位置獲取邊的權
char AdjacentTable::GetWeightByPos(int v1, int v2) const
{
	if ((v1 >= 0) && (v2 >= 0) && (v1 < numOfVertices) && (v2 < numOfVertices))
	{
		Vertex *p = startVertex;
		for (int i=0; i<v1; i++)
		{
	    	p = p->next;
		}
		Edge *q = p->out;
		while (q)
		{
			if (q->position == v2)
			{
				return (q->weight);
			}
			else
			{
				q = q->link;
			}
		}
	}
	return '#';
}
// 按頂點值獲取邊的權
char AdjacentTable::GetWeightByValue(int value1, int value2) const
{
	return GetWeightByPos(GetPosByValue(value1), GetPosByValue(value2));
}
// 設置頂點的值
void AdjacentTable::SetValue(int value, int pos)
{
	if ((pos < 0) || (pos >= numOfVertices))
	{
		cout << "Illegal setting: The vertex doesn't exist!" << endl;
		getch();
		exit(1);
	}
	Vertex *p = startVertex;
	for (int i=0; i<pos; i++)
	{
		p = p->next;
	}
	p->number = value;
}
// 插入頂點
void AdjacentTable::InsertVertex(int value)
{
	int pos = GetPosByValue(value);
	if ((pos >= 0) && (pos < numOfVertices))
	{
		cout << "Illegal insertion: The same vertex has existed!" << endl;
		getch();
		exit(1);
	}
	Vertex *p = startVertex;
	while (p->next)
	{
		p = p->next;
	}
	Vertex *newVertex = new Vertex(value);
	p->next = newVertex;
	numOfVertices++;
}
// 按頂點位置插入邊表
void AdjacentTable::InsertEdgeByPos(int v1, int v2, char weight)
{
	if ((v1 < 0) || (v1 >= numOfVertices) || (v2 < 0) || (v2 >= numOfVertices))
	{
		cout << "Illegal insertion: The vertex doesn't exist!" << endl;
		getch();
		exit(1);
	}
	Vertex *p = startVertex;
	for (int i=0; i<v1; i++)
	{
		p = p->next;
	}
	Edge *q = p->out;
	Edge *newEdge = new Edge(GetValueByPos(v2), v2, weight);
	if (! q)
	{
		p->out = newEdge;
		numOfEdges++;
		return;
	}
	while ((q->position != v2) && (q->link))
	{
		q = q->link;
	}
	if (q->position == v2)
	{
		cout << "Illegal insertion: The Edge has existed!" << endl;
		getch();
		exit(1);
	}
	if (! q->link)
	{
		q->link = newEdge;
		numOfEdges++;
	}
}
// 按頂點值插入邊表
void AdjacentTable::InsertEdgeByValue(int value1, int value2, char weight)
{
	int v1 = GetPosByValue(value1), v2 = GetPosByValue(value2);
	InsertEdgeByPos(v1, v2, weight);
}
// 刪除所有的邊表
void AdjacentTable::RemoveAllEdges(void)
{
	Vertex *p = startVertex;
	for (int i=0; i<numOfVertices; i++)
	{
		Edge *q = p->out;
		while (q)
		{
			p->out = q->link;
			delete q;
			q = p->out;
		}
		p = p->next;
	}
	numOfEdges = 0;
}
// 清空鄰接表
void AdjacentTable::Clear(void)
{
	RemoveAllEdges();
	Vertex *p = startVertex->next;
	while (p)
	{
		startVertex->next = p->next;
		delete p;
		p = startVertex->next;
	}
	numOfVertices = 1;
}
// 閉包函數
int* AdjacentTable::Closure(int *T)
{
	int i = 0, j, k = 0, l, len = 0;
	int *temp = new int[128];
	Vertex *p;
	Edge *q;
	while (T[len] != -1)
	{
		len++;
	}
	while (T[i] != -1)
	{
    	for (l=0; l<k; l++)
		{
			if (T[i] == temp[l])
			{
		    	break;
			}
		}
	    if (l == k)
		{
			temp[k] = T[i];
			k++;
		}
		int pos = GetPosByValue(T[i]);
		p = startVertex;
		for (j=0; j<pos; j++)
		{
			p = p->next;
		}
		q = p->out;
		while (q)
		{
			if (q->weight == '~')
			{
				for (l=0; l<k; l++)
				{
			    	if (q->number == temp[l])
					{
			    		break;
					}
				}
		    	if (l == k)
				{
			    	temp[k] = q->number;
		    		k++;
					T[len++] = q->number;
					T[len] = -1;
				}
			}
			q = q->link;
		}
		i++;
	}
	temp[k] = -1;
	return temp;
}
// 移動函數
int* AdjacentTable::Move(int *T, char ch)
{
	int i = 0, j, k = 0, l;
	int *temp = new int[128];
	Vertex *p;
	Edge *q;
	while (T[i] != -1)
	{
		int pos = GetPosByValue(T[i]);
		p = startVertex;
		for (j=0; j<pos; j++)
		{
			p = p->next;
		}
		q = p->out;
		while (q)
		{
			if (q->weight == ch)
			{
				for (l=0; l<k; l++)
				{
			    	if (q->number == temp[l])
					{
			    		break;
					}
				}
		    	if (l == k)
				{
			    	temp[k] = q->number;
		    		k++;
				}
			}
			q = q->link;
		}
		i++;
	}
	temp[k] = -1;
	return temp;
}
// 輸出鄰接表
void AdjacentTable::OutputNFA(void)
{
	Vertex *p = startVertex;
	Edge *q = new Edge();
	cout << "狀態   邊(權值)" << endl;
	for (int i=0; i<numOfVertices; i++)
	{
		cout << p->number;
		if (p->number < 10)	 cout << "      ";
		else if (p->number < 100)  cout << "     ";
		else if (p->number < 1000)	cout << "    ";
		else  cout << "   ";
		q = p->out;
		if (q)
		{
			while (q)
			{
				cout << q->number << "(" << q->weight << ") ";
				q = q->link;
			}
		}
		else 
		{
			cout << "END";
		}
		cout << endl;
		p = p->next;
	}
}

/////////////////////////////////////////////////

// 定義轉移矩陣類
class TransitionTable
{
public:
	TransitionTable(int rowNum, int colNum);
	~TransitionTable();
	void SetValue(int i, int j, int value);
	int GetValue(int i, int j);
	int Transit(int current, char input, char *edge);
	void Clear(void);
private:
	int **matrix;
	int rowNumber;
	int colNumber;
};
// 構造函數
TransitionTable::TransitionTable(int rowNum, int colNum)
{
	rowNumber = rowNum;
	colNumber = colNum;
	matrix = (int**)(new int*[rowNumber]);
	for (int i=0; i<rowNumber; i++)
	{
		matrix[i] = new int[colNumber];
	}
}
// 析構函數
TransitionTable::~TransitionTable()
{
	Clear();
}
// 設置元素的值
void TransitionTable::SetValue(int i, int j, int value)
{
	matrix[i][j] = value;
}
// 獲取元素的值
int TransitionTable::GetValue(int i, int j)
{
	return matrix[i][j];
}
// 狀態轉移函數
int TransitionTable::Transit(int current, char input, char *edge)
{
	for (int i=0; edge[i]!= '\0'; i++)
	{
		if (input == edge[i])

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
本田岬高潮一区二区三区| 4438x成人网最大色成网站| 色综合久久久久| 日韩一级片网址| 欧美韩国一区二区| 蜜臀av性久久久久av蜜臀妖精| 国产精品91一区二区| 欧美日韩精品一区二区三区蜜桃| 欧美经典一区二区三区| 日本强好片久久久久久aaa| www.色精品| 精品国产露脸精彩对白| 日韩精品欧美成人高清一区二区| 成人91在线观看| 欧美精品一区二区三区蜜桃| 午夜精品久久久久久久99水蜜桃| 成人动漫一区二区三区| 久久婷婷一区二区三区| 91欧美一区二区| 久久久美女毛片| 免费不卡在线视频| 欧美性xxxxxx少妇| 亚洲啪啪综合av一区二区三区| 国产乱对白刺激视频不卡| 欧美一级黄色录像| 日韩电影一区二区三区四区| 欧美亚洲另类激情小说| 亚洲欧美日韩中文字幕一区二区三区 | 欧美喷潮久久久xxxxx| 中文字幕一区免费在线观看| 国产精品一区二区不卡| 精品国产91九色蝌蚪| 蜜桃视频一区二区三区 | 亚洲精品视频自拍| av一区二区三区| 亚洲国产精品二十页| 国产91精品露脸国语对白| 国产午夜精品久久久久久久| 国产jizzjizz一区二区| 久久久91精品国产一区二区精品| 精品一区二区三区免费观看 | 精品一区二区三区免费视频| 日韩女优av电影| 久久成人久久鬼色| 久久蜜臀精品av| 高清在线观看日韩| 中文字幕一区二区三区av| 99久久免费精品| 亚洲精品成人在线| 国产精品久久毛片av大全日韩| 福利一区二区在线| 亚洲日本va午夜在线电影| 在线视频综合导航| 丝袜亚洲另类丝袜在线| 精品久久国产97色综合| 国产成人免费视频网站高清观看视频| 国产女主播在线一区二区| 95精品视频在线| 亚洲.国产.中文慕字在线| 宅男在线国产精品| 国产一区二区免费在线| 亚洲日本在线看| 7777女厕盗摄久久久| 国产老肥熟一区二区三区| 亚洲欧美色图小说| 日韩一区二区不卡| 成人av网站在线观看免费| 亚洲一二三级电影| 久久亚洲综合色一区二区三区| 粉嫩高潮美女一区二区三区 | 裸体健美xxxx欧美裸体表演| 2024国产精品| 色婷婷精品大视频在线蜜桃视频| 日本在线播放一区二区三区| 国产人成亚洲第一网站在线播放 | 日韩视频不卡中文| 成人美女视频在线观看| 日韩高清不卡一区二区三区| 国产视频亚洲色图| 欧美日韩国产a| 成人激情av网| 久久精品国产色蜜蜜麻豆| 亚洲视频一区二区在线观看| 日韩欧美在线影院| 色999日韩国产欧美一区二区| 久久精品国产第一区二区三区| 综合久久久久综合| 久久综合久久综合久久| 欧美亚洲尤物久久| jlzzjlzz国产精品久久| 久久国产夜色精品鲁鲁99| 亚洲最新在线观看| 国产精品美女视频| 久久你懂得1024| 欧美人牲a欧美精品| 北岛玲一区二区三区四区| 久久er精品视频| 偷拍亚洲欧洲综合| 一区二区成人在线| 国产精品免费久久久久| 亚洲精品一区二区三区精华液| 欧美顶级少妇做爰| 色哟哟精品一区| www.爱久久.com| 国产v日产∨综合v精品视频| 国产一区在线视频| 国产原创一区二区| 精品一区二区免费在线观看| 天堂久久久久va久久久久| 亚洲在线成人精品| 亚洲黄色小视频| 亚洲免费观看高清| 亚洲乱码国产乱码精品精的特点 | 欧美一区二区三区喷汁尤物| 在线观看av一区| 91久久人澡人人添人人爽欧美| av在线一区二区三区| 成人一道本在线| 风间由美中文字幕在线看视频国产欧美| 精品一区二区在线视频| 久久精品理论片| 开心九九激情九九欧美日韩精美视频电影 | 678五月天丁香亚洲综合网| 在线欧美一区二区| 91精品1区2区| 欧美优质美女网站| 欧美日韩一区小说| 7777精品伊人久久久大香线蕉完整版 | 美女视频免费一区| 麻豆视频观看网址久久| 久久精品国产网站| 国产综合久久久久久久久久久久| 国产又粗又猛又爽又黄91精品| 国产麻豆日韩欧美久久| 成人手机在线视频| 一本久久综合亚洲鲁鲁五月天| 色欧美日韩亚洲| 欧美性xxxxxx少妇| 日韩欧美国产综合一区| 久久久久久久久97黄色工厂| 国产精品久线在线观看| 夜夜嗨av一区二区三区四季av | 欧美天堂一区二区三区| 欧美一区二区三区免费| 欧美精品一区二区三区蜜桃| 欧美极品aⅴ影院| 亚洲国产日韩精品| 极品少妇xxxx精品少妇偷拍| 成人av综合一区| 欧美巨大另类极品videosbest| 久久综合久色欧美综合狠狠| 1000精品久久久久久久久| 午夜天堂影视香蕉久久| 国产乱码精品一品二品| 欧美亚日韩国产aⅴ精品中极品| 欧美一区二区免费视频| 国产精品日韩精品欧美在线| 亚洲国产综合人成综合网站| 国内久久婷婷综合| 色婷婷av一区二区| 久久美女高清视频| 亚洲一区二区精品视频| 国产麻豆一精品一av一免费| 欧美视频在线一区二区三区| 欧美精品一区二区三区蜜臀| 一区二区三区精品视频在线| 国产一二精品视频| 精品污污网站免费看| 中文字幕高清不卡| 日本欧美大码aⅴ在线播放| av资源网一区| 久久亚洲影视婷婷| 日韩高清电影一区| 色婷婷综合久久久中文字幕| 久久夜色精品国产噜噜av| 午夜欧美2019年伦理| 91视视频在线直接观看在线看网页在线看| 日韩视频在线永久播放| 亚洲综合在线观看视频| 成人高清在线视频| 久久九九全国免费| 日精品一区二区三区| 91亚洲精品久久久蜜桃网站| 久久伊人中文字幕| 青青草视频一区| 欧美日韩成人在线一区| 亚洲另类中文字| 成人精品视频.| 国产日本一区二区| 欧美欧美欧美欧美首页| 亚洲日本va在线观看| 成人丝袜高跟foot| 国产清纯白嫩初高生在线观看91 | 一区二区三区欧美日| 成人视屏免费看| 国产日韩精品久久久| 国产成人在线免费| 国产拍揄自揄精品视频麻豆| 国产一区二区在线影院| 精品88久久久久88久久久|