欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

c++數(shù)據(jù)結(jié)構(gòu)之廣義表-創(chuàng)新互聯(lián)

最近學(xué)習(xí)了廣義表,我們知道廣義表也是一種線性表,而顧名思義廣義表就是不止一個表,下面來舉個栗子:

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),確山企業(yè)網(wǎng)站建設(shè),確山品牌網(wǎng)站建設(shè),網(wǎng)站定制,確山網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,確山網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

A=( )

B=(1 , 2,3)

C=(1 ,2 ,3, ( a , b ,c) )

D=(1, 2, 3, (a,( b,c),d),4)

以上A,B,C,D都是廣義表,只不過深度不一樣,也就是括號的對數(shù)不一樣,A是個特殊的廣義表,即空表。B里面有三個元素,C里面有6個元素,包括一個子表(a,b,c),C也同理,只不過多了一層子表。由此可總結(jié)為一句話:表里有表

這樣看可能不太直觀,下面以廣義表C為例來看一下它的結(jié)構(gòu)圖:

c++數(shù)據(jù)結(jié)構(gòu)之廣義表

c++數(shù)據(jù)結(jié)構(gòu)之廣義表

(圖畫得有點(diǎn)丑,不要吐槽我)

每當(dāng)遇到一個前括號,就要創(chuàng)建一個子表,直到遇見收括號。

那么如何創(chuàng)建一個廣義表呢,在創(chuàng)建節(jié)點(diǎn)結(jié)構(gòu)體的時候,我們要考慮每個節(jié)點(diǎn)的類型,有可能是頭結(jié)

點(diǎn),也有可能是子表節(jié)點(diǎn),也有可能是普通的值節(jié)點(diǎn),所以在構(gòu)造節(jié)點(diǎn)的時候就要定義一個三元體,由

于是表里有表,我們可以用遞歸的方法來解決廣義表的問題,每個子表都可以遞歸為一個子問題,就可

以很輕松的解決掉這個問題了。

下面是具體實現(xiàn)的代碼:

先構(gòu)造一個三元結(jié)構(gòu)體:

enum Type
{
	HEAD,
	VALUE,
	SUB,
};
template<class T>
struct GeneralizedNode
{
	Type _type;
	GeneralizedNode<T>* _next;

	union
	{
		char _value;
		GeneralizedNode<T>* _sublink;   //子表的頭結(jié)點(diǎn)
	};
public:
	GeneralizedNode(Type type = HEAD,char value = '\0')
		:_type(type)
		,_next(NULL)
	{
			if (type == VALUE)
			{
				_value = value;
			}
			else if (type == SUB)
			{
				_sublink = NULL;
			}
		}
};

下面來構(gòu)造一個廣義表類

template<class T>
class GeneralizedList
{
public:
	GeneralizedList()
		:_head(new GeneralizedNode<T>(HEAD))
	{}
	GeneralizedList(const char* str)
	{
		_head=_CreateList(str);
	}
	GeneralizedList(const GeneralizedList& g)    //拷貝構(gòu)造
	{
		_head = Copy(g._head;)
	}
	size_t Size()
	{
		return size(_head);
	}
	size_t depth()
	{
		return Depth(_head);
	}
	
	void print()
	{
		Print(_head);
	}
protected:
	GeneralizedNode<T>* _CreateList(const char*& str)
	{
		assert(str && *str == '(');
			++str;

		GeneralizedNode<T>* Head = new GeneralizedNode<T>(HEAD,NULL);
		GeneralizedNode<T>* cur = Head;

		while (*str)
		{
			if (_IsValue(*str))
			{
				cur->_next = new GeneralizedNode<T>(VALUE,*str);

				cur = cur->_next;
				str++;
			}
			else if (*str == '(')
			{
				GeneralizedNode<T>* newNode= new GeneralizedNode<T>(SUB);        //將一個子表結(jié)點(diǎn)加入到鏈表中
				cur->_next = newNode;
				cur = cur->_next;
				cur->_sublink = _CreateList(str);

				str++;//遞歸創(chuàng)建一個子表結(jié)點(diǎn)
			}
			else if (*str == ')')               //表示一個表已經(jīng)結(jié)束
			{
				str++;
				return Head;
			}
			else
			{
				str++;     //不需要處理的情況
			}
			
		}
		assert(false);
		return Head;
	}


	size_t Depth(GeneralizedNode<T>* head)
	{
		GeneralizedNode<T>* cur = head;
		size_t depth = 1;

		while (cur)
		{
			if (cur->_type == SUB)
			{
				size_t subdepth = Depth(cur->_sublink);
			
			if (subdepth+1 > depth)
			{
				depth=subdepth;//保存較大的深度
			}
			}
			cur = cur->_next;
		}
		
		return depth;
	}


	size_t size(GeneralizedNode<T>* head)
	{
		GeneralizedNode<T>* cur = head;

		size_t count = 0;
		while (cur)
		{
			if (cur->_type != SUB)
			{
				count++;
			}
			else
			{
				count += size(cur->_sublink);
			}
			cur = cur->_next;
		}
		return count;
	}

	void Print(GeneralizedNode<T>* head)
	{
		GeneralizedNode<T>* cur = head;
		while (cur)
		{
             if (cur->_type == HEAD)
			{
				cout << '(';
			}
			else if (cur->_type == VALUE)
			{
				cout << cur->_value ;
				if (cur->_next != NULL)
				{
					cout << ',' ;
				}
			}
			
			else if (cur->_type == SUB)
			{
				Print(cur->_sublink);
				if (cur->_next != NULL)
				{
					cout << ',';
				}
			}
			cur = cur->_next;
		}
		cout << ')';
		
	}
	
	
	bool _IsValue(char ch)   //檢查是否為合法值
	{
		if ((ch >= '0'&&ch<='9') || (ch>='a'&&ch<='z') || (ch>='A'&&ch <= 'Z'))
		{
			return true;
		}
		return false;
	}
protected:
	GeneralizedNode<T>* _head;
};

下面給出測試代碼:

#include"Generalized.h"
void Test()
{
	char* ch = "(a,b,c,(1,2),c)";
	GeneralizedList<char> gl1(ch);
	gl1.print();
	cout << endl;
	cout << "廣義表深度為:" << gl1.depth() << endl;
	cout << "廣義表大小為:" << gl1.Size() << endl;
}

int main()
{
	Test();
	getchar();
	return 0;
}

運(yùn)行結(jié)果:

c++數(shù)據(jù)結(jié)構(gòu)之廣義表

以上就是C++實現(xiàn)廣義表的方法啦,里面也許還存在著一些問題,希望大家能夠指正出來,共同促進(jìn)學(xué)習(xí)。

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。

分享名稱:c++數(shù)據(jù)結(jié)構(gòu)之廣義表-創(chuàng)新互聯(lián)
轉(zhuǎn)載來于:http://chinadenli.net/article26/dcjecg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、面包屑導(dǎo)航外貿(mào)建站、靜態(tài)網(wǎng)站、動態(tài)網(wǎng)站網(wǎng)站設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
精品少妇一区二区视频| 日本不卡一本二本三区| av国产熟妇露脸在线观看| 日韩精品小视频在线观看| 91免费一区二区三区| 亚洲精品伦理熟女国产一区二区| 在线观看免费视频你懂的| 夜色福利久久精品福利| 亚洲中文字幕人妻av| 好吊妞在线免费观看视频| 欧美人妻一区二区三区| 亚洲欧美国产精品一区二区| 日韩欧美高清国内精品| 熟女中文字幕一区二区三区| 国产精品一区二区三区日韩av | 国产精品一区二区三区欧美| 免费精品一区二区三区| 亚洲熟妇av一区二区三区色堂 | 亚洲国产日韩欧美三级| 麻豆一区二区三区在线免费| 中文字幕日韩欧美理伦片| 偷拍美女洗澡免费视频| 国产欧美日产久久婷婷| 欧美加勒比一区二区三区| 精品熟女少妇一区二区三区| 很黄很污在线免费观看| 九九热精彩视频在线播放| 日韩精品视频一二三区| 日本人妻精品中文字幕不卡乱码 | 亚洲国产日韩欧美三级| 国产精品国产亚洲区久久| 激情三级在线观看视频| 高清亚洲精品中文字幕乱码| 麻豆国产精品一区二区| 国产日韩欧美综合视频| 国产一区二区三区丝袜不卡| 一级片黄色一区二区三区| 日韩欧美国产精品中文字幕| 亚洲欧美国产中文色妇| 偷拍美女洗澡免费视频| 日本av一区二区不卡|