亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
亚洲欧美怡红院| 亚洲国产成人精品视频| 一区二区三区免费看视频| 日韩av不卡在线观看| 高清日韩电视剧大全免费| 欧美伦理视频网站| 国产精品天天看| 国产真实乱偷精品视频免| 欧美日韩精品欧美日韩精品 | 国产成人在线影院| 69堂国产成人免费视频| 亚洲欧美一区二区三区久本道91 | 欧美一区二区三区在线观看| 中文字幕一区二区三区四区| 韩日精品视频一区| 欧美一卡2卡3卡4卡| 亚洲一区二区三区四区五区黄| 国产盗摄女厕一区二区三区 | 欧美系列日韩一区| 亚洲欧洲99久久| 国产麻豆精品一区二区| 欧美一区二区三区在线视频| 亚洲自拍与偷拍| 91美女福利视频| 亚洲国产精品成人综合| 九九九精品视频| 日韩欧美成人激情| 午夜精彩视频在线观看不卡| 在线视频国内自拍亚洲视频| 亚洲欧美日韩综合aⅴ视频| 成人aaaa免费全部观看| 国产精品视频你懂的| 国产成人精品一区二区三区网站观看| 精品国产凹凸成av人导航| 久久激情五月激情| 亚洲精品一区二区三区香蕉| 韩国v欧美v亚洲v日本v| 26uuu国产电影一区二区| 国产一区二区在线观看视频| 精品国产99国产精品| 国产黄人亚洲片| 中文字幕av一区二区三区高| 不卡视频在线看| 亚洲人成网站在线| 欧美亚洲国产一卡| 日本 国产 欧美色综合| 欧美精品一区二区三区蜜臀| 韩国v欧美v日本v亚洲v| 国产精品久久久久久久久免费相片 | 国产精品欧美极品| 91首页免费视频| 亚洲香肠在线观看| 日韩一区二区三区免费观看| 国模大尺度一区二区三区| 久久久亚洲高清| www.欧美.com| 亚洲成人一区在线| 欧美一级久久久| 国产成人免费视频网站| 亚洲日穴在线视频| 555www色欧美视频| 国产ts人妖一区二区| 亚洲理论在线观看| 日韩三级高清在线| 国产a区久久久| 亚洲一区二区精品久久av| 精品久久久久久综合日本欧美| 懂色av一区二区夜夜嗨| 一区二区理论电影在线观看| 欧美一区二区三区播放老司机| 国产精品一区二区在线播放| 亚洲日本一区二区三区| 日韩欧美视频在线| 91蝌蚪porny| 不卡的av在线| 亚洲6080在线| 国产精品美女久久久久久久网站| 91久久精品午夜一区二区| 久久99精品国产麻豆婷婷洗澡| 国产精品久久三| 日韩欧美激情四射| 色八戒一区二区三区| 国产综合久久久久影院| 亚洲制服欧美中文字幕中文字幕| 久久亚洲精品小早川怜子| 欧美三级一区二区| www.99精品| 国产在线观看免费一区| 亚洲电影中文字幕在线观看| 中文欧美字幕免费| 日韩免费看网站| 欧美日韩一级黄| 成人a级免费电影| 国产美女精品在线| 日本在线不卡视频| 亚洲一区免费视频| 亚洲色图视频网站| 欧美激情一区二区三区| 欧美va亚洲va香蕉在线| 在线不卡中文字幕播放| 欧美自拍偷拍午夜视频| 99久久精品免费观看| 国产乱子伦视频一区二区三区| 午夜私人影院久久久久| 在线视频亚洲一区| 懂色av中文一区二区三区| 国产91精品久久久久久久网曝门 | 国产精品视频一二三区| 日韩美一区二区三区| 91麻豆精品国产91| 日本道在线观看一区二区| 高清在线不卡av| 国产中文字幕精品| 国产一区二区三区四区五区入口| 日本vs亚洲vs韩国一区三区| 亚洲成人黄色小说| 日日夜夜免费精品| 日韩av不卡一区二区| 五月婷婷激情综合网| 亚洲成国产人片在线观看| 亚洲高清一区二区三区| 亚洲夂夂婷婷色拍ww47 | 亚洲6080在线| 欧美96一区二区免费视频| 亚洲国产一区在线观看| 亚洲成人先锋电影| 日本女优在线视频一区二区| 日本最新不卡在线| 老汉av免费一区二区三区| 久久精品国产精品亚洲红杏| 韩国v欧美v日本v亚洲v| 高清不卡在线观看av| 一本大道综合伊人精品热热| 91福利精品第一导航| 欧美疯狂做受xxxx富婆| 日韩女优电影在线观看| 国产欧美一区二区三区鸳鸯浴 | 午夜婷婷国产麻豆精品| 日韩国产在线观看一区| 久久99精品国产麻豆不卡| 国产一区 二区 三区一级| www.久久久久久久久| 欧美性生活一区| 欧美xxxxx牲另类人与| 中文字幕免费不卡| 亚洲图片欧美色图| 精品在线一区二区| 99riav久久精品riav| 欧美日韩一区二区三区高清| 91精品国产麻豆国产自产在线 | 国产原创一区二区| 91社区在线播放| 欧美一区二区三区男人的天堂| 久久影院视频免费| 亚洲精品福利视频网站| 久久国产精品一区二区| av不卡免费电影| 欧美一级片在线| 亚洲视频在线观看三级| 男女性色大片免费观看一区二区| 国产高清亚洲一区| 欧美精品黑人性xxxx| 国产精品丝袜久久久久久app| 亚洲1区2区3区视频| 春色校园综合激情亚洲| 6080国产精品一区二区| 亚洲品质自拍视频| 国产精品亚洲第一区在线暖暖韩国| 91福利社在线观看| 中文字幕av资源一区| 麻豆精品新av中文字幕| 欧美性色黄大片| 国产精品女主播av| 国产在线精品免费| 制服丝袜国产精品| 亚洲欧美视频一区| 国产不卡在线视频| 欧美精品一区二区三区蜜臀| 亚洲成a人片在线观看中文| www.成人网.com| 久久久综合视频| 久久精品视频免费观看| 欧美成人乱码一区二区三区| 日韩一区在线看| 国产一区三区三区| 日韩欧美国产午夜精品| 亚洲福利视频一区| 精品粉嫩超白一线天av| 午夜精品一区二区三区电影天堂| 国产91对白在线观看九色| 精品国产伦一区二区三区观看方式 | 欧美剧情片在线观看| 亚洲精品欧美专区| 91捆绑美女网站| ●精品国产综合乱码久久久久| 国产69精品一区二区亚洲孕妇 | 欧美激情一区在线观看| 国产精品一二二区| 久久女同互慰一区二区三区| 蜜桃传媒麻豆第一区在线观看|