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

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

?? ass2.cpp

?? 離散數學中---------一階謂詞演算源代碼
?? CPP
字號:
#include "ass2.h"
#include "math.h"
#include <iostream>
#include <string>

//typedef struct _GrammarProposition
//{
//	struct _GrammarProposition* lChild;
//	struct _GrammarProposition* rChild;
//	int attribution;
//	string strKey;
//}GrammarProposition,*LGrammarProposition;
using namespace std;

struct node {
     string  nodeChar;
     int     attribution;
};

Proposition::~Proposition()
{
	 DestroyTree(grammarTree);
}

Proposition::Proposition()
{
   grammarTree = NULL;
}

Proposition::Proposition(const string& strProp)
{
   parse(strProp);
}

void Proposition::DestroyTree(LGrammarProposition T)
{
     if (T)
	 {
			if ( T->lChild ) DestroyTree(T->lChild);
			if ( T->rChild ) DestroyTree(T->rChild);
			if (T->lChild == NULL && T->rChild == NULL) 
			{
				delete T;
				return;
			}
     }
}

bool Proposition::equivalent(const Proposition& prop) const
{
	 unsigned int i;
	 unsigned int nItems; 
	 TruthtableVistor localVistor,otherVistor;
     vector<bool> localTruthTable,otherTruthTable;
	 if (varPool.size() != prop.getVariant().size()) 
		 return false;
	 nItems = pow(2,varPool.size());
	 localVistor.visit(*this);
	 otherVistor.visit(prop);
     localTruthTable = localVistor.getTruthTable();
	 otherTruthTable = otherVistor.getTruthTable();
	 for(i=0;i<nItems;i++)
	 {
         if(localTruthTable[i] != otherTruthTable[i])
			 return false;
	 }    
}

void Proposition::accept(PropositionVistor& vistor) const 
{
     vistor.visit(*this);
}

bool Proposition::implied_by(const vector<const Proposition*>) const
{
	return false;
}

Proposition* Proposition::parse(const string& strProp)
{
    char ch;
	int i;
	int operType;
	//int operLength;
	int length;
	int status;
	int find = 0;
	int prePos,postPos;
	list<node> characterList;
	list<node>::iterator iter;
	stack<node> computeStack;
	stack<LGrammarProposition> tempNodeAddressStack;//處理中間節點,在從棧到語法樹的過程中這要產生P|Q和 P|R  
	//等中間結點在棧中,每個中間節點都有一個樹結構,所以要保存這些子二叉樹的根節點的地址才行,所以又用了一個棧來輔助
	prePos = postPos = 0;
	ch = strProp[prePos++];
	node nodeTemp;
	while ( ch == '\t' || ch == '\n' || ch == ' ') ch = strProp[prePos++];
	prePos--;
	postPos = prePos;
    
	length = strProp.size();
	status = 0;
	//check if valid  詞法分析
	do 
	{ 		
		ch = strProp[postPos];

		//0----處理變量   1----處理操作符
        if ( status == 0) 
		{
			if (isalpha(ch)) 
			{
				postPos++;
			}
			else if ( ch == ' ') 
			{
				if ( prePos == postPos) 
				{
					return NULL;
				}
				else
				{
					nodeTemp.nodeChar.assign(strProp,prePos,postPos-prePos);
					nodeTemp.attribution = 0;
					characterList.push_back(nodeTemp);
					nodeTemp.nodeChar="";
				}
				prePos = postPos;
				ch = strProp[prePos++];
				while ( ch == '\t' || ch == '\n' || ch == ' ') ch = strProp[prePos++];
				prePos--;
				postPos =  prePos;
				//開始進入操作符狀態轉化
				find = 0;
				if (!isalpha(ch)) 
				{
					for( i = MIN_OPER_LENGTH;i <= MAX_OPER_LENGTH;i++)
					{
                         nodeTemp.nodeChar.assign( strProp ,prePos,i);
						 if (IsOperator( nodeTemp.nodeChar,operType,postPos))
						 {
							 status = 1;
							 //nodeTemp.nodeChar.assign(strProp,prePos,postPos-prePos);
							 nodeTemp.attribution = operType;
							 characterList.push_back(nodeTemp);
							 nodeTemp.nodeChar="";
							 prePos = postPos;
							 find = 1;
							 break;
						 }
					}
					//沒有這樣的操作符
                    if (find == 0) return NULL;
				}//if (!isalpha(ch))
			}//else if ( ch == ' ')
			else
			{
                return NULL;
			}
        }//if ( status == 0)
		if (status == 1) 
		{
			if (postPos >= length) break;
			ch = strProp[prePos++];
			while ( ch == '\t' || ch == '\n' || ch == ' ') ch = strProp[prePos++];
			prePos--;
			postPos =  prePos;
			if (isalpha(ch)) 
			{
				postPos++;
				status = 0;
				continue;
			}
			find = 0;
			if (!isalpha(ch)) 
			{
				for( i = MIN_OPER_LENGTH;i <= MAX_OPER_LENGTH;i++)
				{
					nodeTemp.nodeChar.assign( strProp ,prePos,i);
					if (IsOperator( nodeTemp.nodeChar,operType,postPos))
					{
						status = 1;
						//nodeTemp.nodeChar.assign(strProp,prePos,postPos-prePos);
						nodeTemp.attribution = operType;
						characterList.push_back(nodeTemp);
						nodeTemp.nodeChar="";
						prePos = postPos;
						find = 1;
						break;
					}
				}
				//沒有這樣的操作符
				if (find == 0) return NULL;
			}//end for
		}//if (status == 1)	
	} while( postPos <= length);

	//Check grammar and generate grammar tree 語法分析
	node tempNode;
	LGrammarProposition pNode;

	LGrammarProposition pTreeNode = NULL;
	LGrammarProposition plChildNode = NULL;
	LGrammarProposition prChildNode = NULL;

	for(iter = characterList.begin();iter != characterList.end();iter++)
	{
        switch( iter->attribution) 
		{
			case 0:
				varPool.push_back(iter->nodeChar);
                //varPool.push_back(*iter.nodeChar);
				computeStack.push(*iter);
        		break;
			case 1:
				if (computeStack.empty())
				{
					return NULL;
                }
                tempNode = computeStack.top();
				//4---表示臨時節點,#---表示臨時節點的符號
				if ( tempNode.attribution == 4 && tempNode.nodeChar == "#") 
				{
					pNode = tempNodeAddressStack.top();
					pTreeNode = new GrammarProposition;
					pTreeNode->attribution = 1;
					pTreeNode->lChild = NULL;
					pTreeNode->rChild = pNode;
					pTreeNode->strKey = iter->nodeChar;
					tempNodeAddressStack.pop();
				}
				else
				{
					plChildNode = new GrammarProposition;
					plChildNode->attribution = tempNode.attribution;
					plChildNode->strKey = tempNode.nodeChar;
					plChildNode->lChild = NULL;
					plChildNode->rChild = NULL;	
					pTreeNode = new GrammarProposition;
					pTreeNode->attribution = 1;
					pTreeNode->lChild = plChildNode;
					pTreeNode->rChild = NULL;
					pTreeNode->strKey = iter->nodeChar;
				}
				computeStack.pop();
				tempNode.attribution = 4;
				tempNode.nodeChar = "#";
				computeStack.push(tempNode);
				tempNodeAddressStack.push(pTreeNode);
        		break;
			case 2:
				if (computeStack.empty())
				{
					return NULL;
                }
				//右孩子
				tempNode = computeStack.top();
				if ( tempNode.attribution == 4 && tempNode.nodeChar == "#") 
				{
					pNode = tempNodeAddressStack.top();
					pTreeNode = new GrammarProposition;
					pTreeNode->attribution = 2;
					pTreeNode->lChild = NULL;
					pTreeNode->rChild = pNode;//指向臨時保存的子語法樹(中間結點)
					pTreeNode->strKey = iter->nodeChar;
					tempNodeAddressStack.pop();//中間結點出棧
				}
				else
				{
					prChildNode = new GrammarProposition;
					prChildNode->attribution = tempNode.attribution;
					prChildNode->strKey = tempNode.nodeChar;
					prChildNode->lChild = NULL;
					prChildNode->rChild = NULL;	
					pTreeNode = new GrammarProposition;
					pTreeNode->attribution = 2;
					pTreeNode->lChild = NULL;
					pTreeNode->rChild = prChildNode;
					pTreeNode->strKey = iter->nodeChar;
				}
				computeStack.pop();
				//左孩子
				tempNode = computeStack.top();
				if ( tempNode.attribution == 4 && tempNode.nodeChar == "#") 
				{
					pNode = tempNodeAddressStack.top();
					pTreeNode->lChild = pNode;
					tempNodeAddressStack.pop();
				}
				else
				{
					plChildNode = new GrammarProposition;
					plChildNode->attribution = tempNode.attribution;
					plChildNode->strKey = tempNode.nodeChar;
					plChildNode->lChild = NULL;
					plChildNode->rChild = NULL;	

					pTreeNode->lChild = plChildNode;
				}
				computeStack.pop();
				//tempNode = computeStack.top();

				tempNode.attribution = 4;
				tempNode.nodeChar = "#";
				computeStack.push(tempNode);
                tempNodeAddressStack.push(pTreeNode);
				break;
        }
	}
	//清空棧
	tempNodeAddressStack.pop();
	grammarTree = pTreeNode;
	//int varSize;
	//varSize = varPool.size();
	//整理變量池,去掉重復的部分
	TrimVarPool();
	return this;
}

void Proposition::TrimVarPool()
{
    vector<string>::iterator  iter_i,iter_j;
    for(iter_i = varPool.begin();iter_i != varPool.end();iter_i++)
	{
		for(iter_j = iter_i + 1;iter_j != varPool.end();iter_j++)
		{
			if (*iter_i == *iter_j)
			{
				varPool.erase(iter_j);
				if ( iter_j == varPool.end()) break;
			}
		}
	}
	cout<<"變量集合:"<<endl;
	for(iter_i = varPool.begin();iter_i != varPool.end();iter_i++)
	{
		cout<<*iter_i<<endl;
	}
}


//沒彈出一個根節點就先輸出一個(,然后在它左右孩子節點訪問完后就輸出)
void Proposition::postfixTraverse(LGrammarProposition T,string& postfixString)
{
	if (T) 
	{
		postfixTraverse(T->lChild,postfixString);
		postfixTraverse(T->rChild,postfixString);
        postfixString += T->strKey;
		postfixString += " ";
	}
}



string Proposition::getPostfix() 
{
	string postfixString;
    postfixTraverse(grammarTree,postfixString);
	return postfixString;
}

vector<string> Proposition::getVariant() const
{
	return varPool;
}


void InfixVistor::visit(const Proposition& prop)
{
	
	string infixStr = "";
	infixTraverse(prop.grammarTree,infixStr);
	cout<<infixStr<<endl;	
}

void PrefixVistor::visit(const Proposition& prop)
{
	
	string prefixStr = "";
	prefixTraverse(prop.grammarTree,prefixStr);
	cout<<prefixStr<<endl;	
}

void TruthtableVistor::visit(const Proposition& prop)
{
	buildTruthTable(prop);	
}

int TruthtableVistor::serchVariant(string str,const Proposition& prop)
{
	int index ;
    vector<string>::iterator  iter;
	vector<string> varPool;
	varPool = prop.getVariant();
	for(iter = varPool.begin(),index = 0;iter != varPool.end();iter++,index++)
	{
		if (str == *iter) {
			return  index;
		}
	}
	return -1;
}

vector<bool> TruthtableVistor::getTruthTable() const
{
    return truthTable;
}

bool TruthtableVistor::ComputeTruthTable(LGrammarProposition T,const Proposition& prop)
{
	int distance,index;
	bool bLeftRet,bRightRet,bRet;
	if (T) 
	{
        switch(T->attribution) {
        case 0:
			distance = serchVariant(T->strKey,prop);
			bRet =  assignPool[distance];
			break;
        case 1:
			bLeftRet = ComputeTruthTable(T->lChild,prop);
			bRet = ~bLeftRet;
			break;
		case 2:
			bLeftRet = ComputeTruthTable(T->lChild,prop);
			bRightRet = ComputeTruthTable(T->rChild,prop);
			if (T->strKey == "&" )   bRet = bLeftRet & bRightRet;
			if (T->strKey == "|" )   bRet = bLeftRet | bRightRet; 
			if (T->strKey == "=>" )  
			{
				index = ((int)bLeftRet) << 1 | ((int)bRightRet);
				bRet = ifTruthTable[index];
			}
			if (T->strKey == "<=>") 
			{
				index = ((int)bLeftRet) << 1 | ((int)bRightRet);
				bRet = iffTruthTable[index];		
			}
			break;
        }
	}
	return bRet;
}

void TruthtableVistor::buildTruthTable(const Proposition& prop)
{
	//初始化真值表的變量
	int i;
	vector<string>::iterator  var_iter;
	vector<bool>::iterator  iter;
	unsigned int count = 0,nBit,nMask;
	vector<string> varPool = prop.getVariant();
	int varSize;
	varSize = varPool.size();
	unsigned int nItems = pow(2,varSize);
	truthTable.clear();
	for(var_iter = varPool.begin();var_iter != varPool.end();var_iter++)
	{
	    cout<<*var_iter<<"    ";	
	} 
	for(i = 0;i<varSize;i++) assignPool.push_back(false);
	cout<<endl;
	bool truthRet;
	while (count<nItems) 
	{
		for(iter = assignPool.begin(),nBit = 0;iter != assignPool.end();iter++,nBit++)
		{
			nMask = 1 << nBit;
			*iter = (count & nMask) == 0 ?false:true;
			cout<<*iter<<"    ";
		}
		truthRet = ComputeTruthTable(prop.grammarTree,prop);
		cout<< truthRet<<endl;
		truthTable.push_back( truthRet );
		count++;
	}	
}


//沒彈出一個根節點就先輸出一個(,然后在它左右孩子節點訪問完后就輸出)
void PrefixVistor::prefixTraverse(LGrammarProposition T,string& prefixString)
{
	static PrefixEntry = 0;
	if (T) 
	{
		PrefixEntry++;
		if (T->attribution>0) {
			if ( PrefixEntry > 1) {
				prefixString += " ";
			}

			prefixString += "(";
			prefixString += " ";
		}
		if (T->attribution == 0) {
			prefixString += " ";
		}
        prefixString += T->strKey;		
        prefixTraverse(T->lChild,prefixString);
        prefixTraverse(T->rChild,prefixString);
		if (T->attribution>0) {
			if ( PrefixEntry > 1) {
				prefixString += " ";
			}
			prefixString += ")";
		}

	}
}

//沒彈出一個根節點就先輸出一個(,然后在它左右孩子節點訪問完后就輸出)
void InfixVistor::infixTraverse(LGrammarProposition T,string& infixString)
{
	static infixEntry = 0;

	if (T) 
	{
		infixEntry++;
		if (T->attribution>0) {
			if (infixEntry > 1) infixString += " ";
		    infixString += "(";
		
		}
		infixTraverse(T->lChild,infixString);
		infixString += " ";
        infixString += T->strKey;
        infixTraverse(T->rChild,infixString);
		
		if (T->attribution>0) {
		   if (infixEntry > 1)	infixString += " ";
		   infixString += ")";
		}
	}
}

















?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区四区蜜桃| 国产成人精品亚洲日本在线桃色| 免费成人av在线播放| 丁香啪啪综合成人亚洲小说| 欧美日韩中文国产| 中文字幕欧美日本乱码一线二线| 免播放器亚洲一区| 欧美亚洲国产bt| 综合久久国产九一剧情麻豆| 国内精品国产成人国产三级粉色 | 天天操天天干天天综合网| 国产精品一区二区果冻传媒| 在线不卡免费av| 亚洲最新在线观看| av电影在线观看一区| 久久蜜臀精品av| 黄网站免费久久| 91精品国产91久久久久久一区二区 | 国产成人精品免费网站| 在线成人免费视频| 亚洲国产aⅴ天堂久久| 99久久久精品| 日韩理论片中文av| 成人v精品蜜桃久久一区| 精品国产精品一区二区夜夜嗨| 日韩中文字幕亚洲一区二区va在线| 91碰在线视频| 亚洲人午夜精品天堂一二香蕉| 国产aⅴ综合色| 久久精品夜色噜噜亚洲aⅴ| 国产精品综合久久| 久久久精品人体av艺术| 国产高清久久久久| 国产精品免费视频一区| 97久久精品人人澡人人爽| 国产精品久线观看视频| 91免费版在线| 亚洲制服欧美中文字幕中文字幕| 色婷婷av一区二区三区软件| 亚洲最色的网站| 欧美精品三级在线观看| 免费欧美日韩国产三级电影| 日韩一区二区三区视频在线观看| 青草国产精品久久久久久| 日韩一区二区在线观看视频| 国内偷窥港台综合视频在线播放| 久久九九久久九九| 成+人+亚洲+综合天堂| 一区二区三区精品在线观看| 欧美妇女性影城| 黄色日韩三级电影| 国产精品久久久久四虎| 欧美中文一区二区三区| 久久se这里有精品| 国产精品剧情在线亚洲| 欧美视频你懂的| 国产成人综合在线播放| 亚洲男人天堂一区| 日韩亚洲电影在线| 波多野结衣亚洲一区| 亚洲高清不卡在线观看| 精品久久国产字幕高潮| 99国产精品国产精品久久| 天堂精品中文字幕在线| 欧美激情一二三区| 欧美日韩高清不卡| 丰满少妇久久久久久久| 亚洲午夜激情网站| 欧美激情一区二区三区在线| 欧美婷婷六月丁香综合色| 紧缚奴在线一区二区三区| 亚洲视频一区二区在线观看| 91精品在线一区二区| 成人午夜激情片| 精品在线视频一区| 亚洲第一激情av| 中文字幕精品一区二区精品绿巨人| 欧美日韩视频在线第一区 | 老司机午夜精品| 亚洲免费毛片网站| 欧美tickling网站挠脚心| 色噜噜狠狠一区二区三区果冻| 久久99精品久久久久婷婷| 一区二区视频在线| 国产女同性恋一区二区| 日韩网站在线看片你懂的| 94色蜜桃网一区二区三区| 九九视频精品免费| 丝袜a∨在线一区二区三区不卡| 综合分类小说区另类春色亚洲小说欧美| 日韩亚洲欧美一区二区三区| 在线观看成人小视频| 99久久精品费精品国产一区二区| 国产精品乡下勾搭老头1| 日本欧美一区二区在线观看| 日韩理论在线观看| 中文字幕中文乱码欧美一区二区| 欧美成人vps| 欧美一级免费大片| 欧美高清激情brazzers| 在线观看亚洲成人| 在线视频欧美区| 一本到不卡免费一区二区| 91亚洲精品一区二区乱码| 成人av资源在线观看| 国产高清精品久久久久| 国产风韵犹存在线视精品| 久久电影国产免费久久电影| 麻豆91在线播放免费| 久久国产精品露脸对白| 卡一卡二国产精品| 免费成人小视频| 久久国产人妖系列| 韩国理伦片一区二区三区在线播放| 免费观看30秒视频久久| 日韩av中文字幕一区二区| 免费在线欧美视频| 青青草原综合久久大伊人精品| 天天综合色天天| 精品一区二区免费| 国产东北露脸精品视频| 国产福利一区二区| 成人av电影在线观看| 91蜜桃婷婷狠狠久久综合9色| 91在线porny国产在线看| 欧美在线视频日韩| 91精品国产91久久久久久一区二区 | 久久久综合九色合综国产精品| 亚洲精品在线一区二区| 欧美高清在线一区| 亚洲欧美电影院| 亚洲第一会所有码转帖| 免费观看91视频大全| 国产一区二区三区在线观看精品| 国产精品香蕉一区二区三区| 成人精品亚洲人成在线| 色婷婷综合久色| 制服丝袜中文字幕一区| 精品国产污网站| 亚洲日穴在线视频| 亚洲第一激情av| 国产一区二区三区四区五区美女 | 国产精品久久久久久久久动漫| 中文字幕视频一区| 日韩精品午夜视频| 国产成人精品www牛牛影视| 色老综合老女人久久久| 91精品麻豆日日躁夜夜躁| 欧美国产一区在线| 亚洲高清久久久| 成人性视频网站| 欧美一个色资源| 亚洲三级在线免费| 久久99精品久久久| 在线看国产一区二区| 久久亚洲精精品中文字幕早川悠里| 亚洲人成网站在线| 久久精品国产久精国产爱| 91丨九色丨国产丨porny| 日韩精品一区二区在线观看| 亚洲色图在线播放| 精品夜夜嗨av一区二区三区| 日本久久电影网| 久久久亚洲综合| 日本午夜精品视频在线观看| 91免费看片在线观看| 久久美女艺术照精彩视频福利播放| 亚洲综合色婷婷| 99精品热视频| 国产日韩精品视频一区| 美女精品一区二区| 欧美日韩久久一区二区| 最新热久久免费视频| 国产一区999| 欧美成人综合网站| 五月婷婷综合激情| 91福利精品第一导航| 中文一区一区三区高中清不卡| 久久成人久久爱| 制服丝袜亚洲播放| 亚洲一二三区视频在线观看| 91色九色蝌蚪| 亚洲欧美在线视频观看| 国产v综合v亚洲欧| 26uuu精品一区二区在线观看| 视频一区二区国产| 欧美日高清视频| 性久久久久久久久久久久 | 成人免费不卡视频| 国产免费观看久久| 高清不卡一二三区| 国产喂奶挤奶一区二区三区| 狠狠色丁香久久婷婷综合丁香| 欧美精品久久99| 欧美a级一区二区| 精品剧情v国产在线观看在线| 免费观看91视频大全| 精品国产一区二区三区久久久蜜月 | 在线精品亚洲一区二区不卡| 亚洲日本在线视频观看|