中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

廣義表的C++簡單實現

發布時間:2020-07-10 08:00:33 來源:網絡 閱讀:267 作者:檸公子 欄目:編程語言

廣義表是數據結構中非常關鍵的一部分,它的學習對于樹和二叉樹有很大的起承作用。那么,它是怎么實現的呢?廣義表的實現應用到了一個很熟悉的算法——遞歸。來看看它的代碼吧!

#pragma once
#include<iostream>
#include<cassert>
using namespace std;

enum Type
{
	HEAD,//頭
	VALUE, //值
	SUB, //子表
};

struct GeneralizedNode
{
	Type _type;
	GeneralizedNode* _next;
	union
	{
		char _value;
		GeneralizedNode* _sublink;
	};

	GeneralizedNode(Type type=HEAD,char value=0)
		:_type(type)
		,_next(NULL)
	{
		 if(_type==VALUE)
		 {
			 _value=value;		 
		 }
		 else  if(_type==SUB)
		 {
			 _sublink=NULL;
		 }
	}
};

class Generalized
{
public:
	 Generalized(const char* str)
		 :_head(NULL)
	 {
		 _head=_CreateList(str);
	 }

	 Generalized()
		 :_head(new GeneralizedNode())
	 {}
	 
	 ~ Generalized()
	 {
		 _Clear(_head);
		 _head=NULL;
	 }
					 
	 size_t Depth()	   //深度
	 {
		return  _Depth(_head);
	 }

	 void Print()
	 {

		 _Print(_head);
		 cout<<endl;
	 }

	 size_t Size()		 
	 {
		  return _Size(_head);
	 }

	 Generalized(const Generalized &g)
	 {
		 _head=_Copy(g._head);
	 }

	 Generalized& operator=( Generalized g)
	 {
		 swap(this->_head,g._head);
		 return *this;
	 }

protected:
	GeneralizedNode* _head;

	GeneralizedNode* _CreateList(const char* &str)
	{
		 assert(str && *str=='(');
		 ++str;
		 GeneralizedNode* head=new GeneralizedNode(HEAD);
		 GeneralizedNode* cur=head;
		 while(*str)
		 {
			 if(_Isvalue(*str))
			 {
				 cur->_next=new GeneralizedNode(VALUE,*str);
				 cur=cur->_next;
				 str++;
			 }
			 else if(*str=='(')
			 {
				 cur->_next=new GeneralizedNode(SUB);
				 cur=cur->_next;
				 cur->_sublink=_CreateList(str);
				 
			 }
			 else if(*str==')')
			 {	
				  ++str;			 
				  return head;
				  
			 }
			 else
			 {
				 ++str;
			 }
		 }
		 assert(false);
		 return head;
	}

	bool _Isvalue(char ch)
	{
		if( (ch>='0'&&ch<='9') ||  (ch>='a'&&ch<='z')  ||  (ch>='A'&&ch<='z'))
		{
			return true;
		}
		else 
		{
			return false;
		}
	}

	/*int _Depth(GeneralizedNode* head)
	 {			 
		 GeneralizedNode* cur=head;
		 int max=0;
		 if(!cur)
		 {
			 return 1;
		 }
		 if(cur->_type==VALUE)
		 {
			 return 0;
		 }
		 for( max=0;cur;cur=cur->_next)	  
		 {						  
			 int dep=_Depth(cur->_next);
			 if(dep>max)
			 {
				 max=dep;
			 }
		 }
		 return max+1;
	 }*/

	size_t _Depth(GeneralizedNode* head)
	{
		size_t dep=1;
		GeneralizedNode* cur=head;
		while(cur!=NULL)
		{
			if(cur->_type==SUB)
			{
				if(_Depth(cur->_sublink)+1> dep)
				{
					dep=_Depth(cur->_sublink)+1 ;
				}
			}
			cur=cur->_next;
		}
		return dep;
	}

	void _Clear(GeneralizedNode* head)
	{
		GeneralizedNode* cur = head;
		while(cur != NULL)
		{
			GeneralizedNode* del = cur;	
			cur = cur->_next;
 			if(del->_type == SUB)
				{
                    _Clear(del->_sublink);
                }
            delete del;
		}
    }

	void _Print(GeneralizedNode* head)
	{
		GeneralizedNode* cur=head;
		while(cur)
		{  
			if(cur->_type==HEAD)
			{
				cout<<"(";
			}
			else if(cur->_type==VALUE)
			{
				cout<<cur->_value; 
				if(cur->_next)	
				{	
					cout<<"," ;
				}
			}
			else 
			{
				_Print(cur->_sublink);
				if(cur->_next)
				{
					cout<<",";
				}
			}
			
			cur=cur->_next;
		}
		cout<<")";
	}

	size_t _Size(GeneralizedNode* head)
	{
		GeneralizedNode* cur=head;
		size_t size=0;
		while(cur)
		{
			if(cur->_type==VALUE)
			{
				++size;
			}
			else if(cur->_type==SUB)
			{
				size+=_Size(cur->_sublink);		
			}
			cur=cur->_next;
		}
		return size;
	}

	 GeneralizedNode* _Copy(GeneralizedNode* head)
	 {
		 GeneralizedNode* newHead=new GeneralizedNode(HEAD);
		 assert(head->_type==HEAD);
		 GeneralizedNode* cur=head->_next;
		 GeneralizedNode* newcur=newHead;
		 while(cur)
		 {
			 if(cur->_type==VALUE)
			 {
				 newcur->_next=new GeneralizedNode(VALUE,cur->_value);
				 newcur=newcur->_next ;
			 }
			 else if(cur->_type==SUB)
			 {
				 newcur->_next=new GeneralizedNode(SUB);
				 newcur=newcur->_next;
				 newcur->_sublink=_Copy(cur->_sublink);
			 }
			 cur=cur->_next;
		 }
		 return newHead;
	 }

};

代碼雖然看起來很長,但是只要你理解了其結構,相信是不難的。

博主也是調試了好久的~~~~~~~~~~~~廣義表的C++簡單實現

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

嘉兴市| 澳门| 宁都县| 宜黄县| 大厂| 若尔盖县| 开江县| 襄城县| 衡水市| 石屏县| 益阳市| 额尔古纳市| 平定县| 丹江口市| 台北县| 洪泽县| 灵武市| 桐乡市| 浪卡子县| 三门县| 于都县| 潍坊市| 广安市| 彭州市| 长春市| 抚州市| 垫江县| 屏南县| 芜湖县| 洛扎县| 军事| 乌鲁木齐市| 略阳县| 富蕴县| 茂名市| 方山县| 闸北区| 隆昌县| 泌阳县| 台东市| 固镇县|