溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

廣義表的相關(guān)操作

發(fā)布時(shí)間:2020-06-24 13:37:54 來(lái)源:網(wǎng)絡(luò) 閱讀:350 作者:夜的寂寞 欄目:編程語(yǔ)言
//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;
}


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI