广义表的相关操作

发布时间:2020-06-24 13:37:54 作者:夜的寂寞
来源:网络 阅读:350
//Generalized.h
#pragma once 
#ifndef __GENERALIZED_H__
#define __GENERALIZED_H__

enum Type
{
	HEAD,
	VALUE,
	SUB,
};

struct GeneralizedNode
{
	Type _type;
	GeneralizedNode* _next;
	union
	{
		int _value;
		GeneralizedNode* _sublink;
	};
	GeneralizedNode()
	{}
	GeneralizedNode(Type type, const int value = 0) :_type(type), _next(NULL), _value(value)
	{}
};

class Generalized
{
public:
	Generalized();
	Generalized(const char* str);
	Generalized(const Generalized& g);
	Generalized& operator=(const Generalized& g);
	~Generalized();
	void Print()const;
	size_t Size()const;
	size_t Length()const;
	size_t Depth()const;
protected:
	GeneralizedNode* _CreateList(const char* &str);
	GeneralizedNode* _Copy(GeneralizedNode* head);
	void _Destory(GeneralizedNode* head);
	void _PrintGeneral(GeneralizedNode* head)const;
	size_t _SizeGeneralized(GeneralizedNode* head)const;
	size_t _DepthGeneralized(GeneralizedNode* head)const;
protected:
	GeneralizedNode* _head;
};

#endif /*__GENERALIZED_H__*/

Generalized.cpp:

#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include "Generalized.h"
#include <assert.h>

Generalized::Generalized() :_head(NULL)
{}
Generalized::Generalized(const char* str) : _head(NULL)
{
	_head = _CreateList(str);
}
GeneralizedNode* Generalized::_CreateList(const char* &str)
{
	assert(str);
	while (isspace(*str))
	{
		++str;
	}
	assert(*str == '(');
	// D = (a,b,(c,d),(e,(f),h))
	GeneralizedNode* head = new GeneralizedNode(HEAD);
	GeneralizedNode* cur = head;	
	++str;
	while (*str != '\0')
	{
		if (*str == '(')
		{
			cur->_next = new GeneralizedNode(SUB);
			cur = cur->_next;
			cur->_sublink = _CreateList(str);		
		}
		else if ((*str >= '0'&&*str <= '9') ||
			(*str >= 'a'&&*str <= 'z') ||
			(*str >= 'A'&&*str <= 'Z'))
		{
			cur->_next = new GeneralizedNode(VALUE, *str);
			cur = cur->_next;
			++str;
		}
		else if (*str == ')')
		{
			++str;
			break;
		}
		else
		{
			++str;
		}
	}
	return head;
}

Generalized::Generalized(const Generalized& g)
{
	this->_head = this->_Copy(g._head);
}

GeneralizedNode* Generalized::_Copy(GeneralizedNode* head)
{
	assert(head);
	GeneralizedNode* cur = head;
	GeneralizedNode* retHead = NULL;
	GeneralizedNode* tmp = NULL;
	while (cur)
	{
		if (cur->_type == HEAD)
		{
			retHead = new GeneralizedNode(HEAD);
			tmp = retHead;
		}
		else if (cur->_type == VALUE)
		{
			tmp->_next = new GeneralizedNode(VALUE, cur->_value);
			tmp = tmp->_next;
		}
		else if (cur->_type == SUB)
		{
			tmp->_next = new GeneralizedNode(SUB);
			tmp->_next->_sublink = _Copy(cur->_sublink);
			tmp = tmp->_next;
		}
		cur = cur->_next;
	}
	return retHead;
}

Generalized& Generalized::operator=(const Generalized& g)
{
	if (this->_head != g._head)
	{
		this->_Destory(this->_head);
		this->_Copy(g._head);
	}
	return *this;
}

Generalized::~Generalized()
{
	this->_Destory(this->_head);
}

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

void Generalized::Print()const
{
	this->_PrintGeneral(this->_head);
}
void Generalized::_PrintGeneral(GeneralizedNode* head)const
{
	assert(head);
	GeneralizedNode* cur = head;
	while (cur)
	{
		if (cur->_type == HEAD)
		{
			std::cout << "(";		
		}
		else if (cur->_type == VALUE)
		{
			std::cout << (char)cur->_value;
			if (cur->_next)
			{
				std::cout << ",";
			}
		}
		else if (cur->_type == SUB)
		{
			//(a,b,(c,d),(e,(f),h)) 
			_PrintGeneral(cur->_sublink);	
			if (cur->_next)
			{
				std::cout << ",";
			}
		}
		cur = cur->_next;
	}
	std::cout << ")";
}

size_t Generalized::Size()const
{
	return this->_SizeGeneralized(this->_head);
}

size_t Generalized::_SizeGeneralized(GeneralizedNode* head)const
{
	if (head == NULL)
	{
		return 0;
	}
	size_t iCount = 0;
	GeneralizedNode* cur = head;
	while (cur)
	{
		if (cur->_type == VALUE)
		{
			++iCount;
		}
		else if (cur->_type == SUB)
		{
			iCount += _SizeGeneralized(cur->_sublink);
		}
		cur = cur->_next;
	}
	return  iCount;
}

size_t Generalized::Length()const
{
	if (this->_head == NULL)
	{
		return 0;
	}
	GeneralizedNode* cur = this->_head->_next;
	size_t iCount = 0;
	while (cur)
	{
		++iCount;
		cur = cur->_next;
	}
	return iCount;
}

size_t Generalized::Depth()const
{
	return this->_DepthGeneralized(this->_head);
}

size_t Generalized::_DepthGeneralized(GeneralizedNode* head)const
{
	assert(head);
	// D = (a,b,(c,d),(e,(f),h))
	GeneralizedNode* cur = head;
	size_t max = 0;
	size_t d = 0;
	while (cur)
	{
		if (cur->_type == SUB)
		{
			d = _DepthGeneralized(cur->_sublink);
			if (max < d)
			{
				max = d;
			}
		}
		cur = cur->_next;
	}
	return max + 1;
}


推荐阅读:
  1. socket相关操作(下)
  2. socket的相关操作

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

深度 大小 广义表

上一篇:WannaCry勒索病毒事件的“来龙去脉”

下一篇:方法在Java中的应用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》