⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datastructs.h

📁 斯坦福Energy211/CME211课《c++编程——地球科学科学家和工程师》的课件
💻 H
字号:
#ifndef INCLUDE_DATASTRUCTS#define INCLUDE_DATASTRUCTS#include <iostream>#include <stdexcept>// Declare these classes in advance so that they// can be declared as friends by node classestemplate<typename T> class Queue;template<typename T> class DQueue;// Node for singly-linked listtemplate<typename T> class SingleNode {	friend class Queue<T>;	friend class Queue<T>::Iterator;		// Make everything private so that only friend	// classes can use this classprivate:	SingleNode( const T& data )	{		m_Data = data;		m_pNext = NULL;	}	~SingleNode()	{		// This makes it possible to delete all		// nodes in a list by deleting the head		delete m_pNext;	}		SingleNode<T> *GetNext() { return m_pNext; }	void SetNext( SingleNode<T> *pNode ) { m_pNext = pNode; }		T& GetData() { return m_Data; }	void SetData( const T& data ) { m_Data = data; }		T m_Data;	SingleNode<T> *m_pNext;} ;// Node for doubly-linked listtemplate<typename T> class DoubleNode {	friend class DQueue<T>;	friend class DQueue<T>::Iterator;	friend class DQueue<T>::ReverseIterator;	private:	DoubleNode( const T& data )	{		m_Data = data;		m_pNext = NULL;		m_pPrev = NULL;	}	~DoubleNode()	{		delete m_pNext;	}		DoubleNode<T> *GetNext() { return m_pNext; }	DoubleNode<T> *GetPrev() { return m_pPrev; }	void SetNext( DoubleNode<T> *pNode ) { m_pNext = pNode; }	void SetPrev( DoubleNode<T> *pNode ) { m_pPrev = pNode; }		T& GetData() { return m_Data; }	void SetData( const T& data ) { m_Data = data; }	T m_Data;	DoubleNode<T> *m_pNext;	DoubleNode<T> *m_pPrev;} ;// Class for implementing a singly-linked listtemplate<typename T> class Queue {public:	Queue()	{		m_pHead = NULL;		m_pTail = NULL;	}	~Queue()	{		delete m_pHead;	}			// Add element to the back of the list	void EnQueue( const T& item )	{		SingleNode<T> *pNewTail = new SingleNode<T>( item );		if ( m_pTail != NULL )			m_pTail->SetNext( pNewTail );		else			m_pHead = pNewTail;		m_pTail = pNewTail;	}	// Remove element from the front of the list	T DeQueue()	{		if ( m_pHead == NULL )			throw std::runtime_error( "queue empty" );		SingleNode<T> *pOldHead = m_pHead;		m_pHead = m_pHead->GetNext();		T data = pOldHead->GetData();		pOldHead->SetNext( NULL );		delete pOldHead;		return data;	}	// Class for iterating through the list	class Iterator {	public:		Iterator( SingleNode<T> *pData = NULL )		{			m_pData = pData;		}		Iterator( const Iterator& i )		{			m_pData = i.m_pData;		}		~Iterator()		{		}				Iterator& operator=( const Iterator& i )		{			m_pData = i.m_pData;			return *this;		}		// Overload ++ for moving through the list		// from front to back		// Prefix form: for implementing ++i		Iterator& operator++() 		{ 			m_pData = m_pData->GetNext();			return *this; 		}		// Postfix form: for implementing i++		Iterator operator++( int ) 		{ 			Iterator result( *this );			++*this;			return result;		}		// Dereferencing extracts underlying data		// Non-const reference		T& operator*()		{			return m_pData->GetData();		}		// const reference		const T& operator*() const		{			return m_pData->GetData();		}		// Comparison operators for use in checking		// whether iteration should end		bool operator!=( const Iterator& i ) const		{			return m_pData != i.m_pData;		}		bool operator==( const Iterator& i ) const		{			return m_pData == i.m_pData;		}			private:		SingleNode<T> *m_pData;	} ;	// These iterators are used to help iterate	// through the entire list	Iterator Begin() const 	{		Iterator i( m_pHead );		return i;	}	Iterator End() const	{		Iterator i( NULL );		return i;	}	private:	SingleNode<T> *m_pHead;	SingleNode<T> *m_pTail;} ;// Class for implementing a doubly-linked listtemplate<typename T> class DQueue {public:	DQueue()	{		m_pHead = NULL;		m_pTail = NULL;	}	~DQueue()	{		delete m_pHead;	}		// For adding to the back of the list	void PushBack( const T& item )	{		DoubleNode<T> *pNewTail = new DoubleNode<T>( item );		if ( m_pTail != NULL )			m_pTail->SetNext( pNewTail );		else			m_pHead = pNewTail;		pNewTail->SetPrev( m_pTail );		m_pTail = pNewTail;	}	// For adding to the front	void PushFront( const T& item )	{		DoubleNode<T> *pNewHead = new DoubleNode<T>( item );		if ( m_pHead != NULL )			m_pHead->SetPrev( pNewHead );		else			m_pTail = pNewHead;		pNewHead->SetNext( m_pHead );		m_pHead = pNewHead;	}	// For removing from the back	T PopBack()	{		if ( m_pTail == NULL )			throw std::runtime_error( "queue empty" );		DoubleNode<T> *pOldTail = m_pTail;		m_pTail = m_pTail->GetPrev();		if ( m_pTail != NULL )			m_pTail->SetNext( NULL );		T data = pOldTail->GetData();		pOldTail->SetNext( NULL );		delete pOldTail;		return data;	}	// For removing from the front	T PopFront()	{		if ( m_pHead == NULL )			throw std::runtime_error( "queue empty" );		DoubleNode<T> *pOldHead = m_pHead;		m_pHead = m_pHead->GetNext();		if ( m_pHead != NULL )			m_pHead->SetPrev( NULL );		T data = pOldHead->GetData();		pOldHead->SetNext( NULL );		delete pOldHead;		return data;	}		// For iterating through the list from front to back	class Iterator {	public:		Iterator( DoubleNode<T> *pData = NULL )		{			m_pData = pData;		}		Iterator( const Iterator& i )		{			m_pData = i.m_pData;		}		~Iterator()		{		}				Iterator& operator=( const Iterator& i )		{			m_pData = i.m_pData;			return *this;		}		Iterator& operator++() 		{ 			m_pData = m_pData->GetNext();			return *this; 		}		Iterator operator++( int ) 		{ 			Iterator result( *this );			++*this;			return result;		}		Iterator& operator--() 		{ 			m_pData = m_pData->GetPrev();			return *this; 		}		Iterator operator--( int ) 		{ 			Iterator result( *this );			--*this;			return result;		}		T& operator*()		{			return m_pData->GetData();		}		const T& operator*() const		{			return m_pData->GetData();		}				bool operator!=( const Iterator& i ) const		{			return m_pData != i.m_pData;		}		bool operator==( const Iterator& i ) const		{			return m_pData == i.m_pData;		}	private:		DoubleNode<T> *m_pData;	} ;		// For iterating through the class from back to front	class ReverseIterator {	public:		ReverseIterator( DoubleNode<T> *pData = NULL )		{			m_pData = pData;		}		ReverseIterator( const ReverseIterator& i )		{			m_pData = i.m_pData;		}		~ReverseIterator()		{		}				ReverseIterator& operator=( const ReverseIterator& i )		{			m_pData = i.m_pData;			return *this;		}		// Note that ++ goes from back to front!		ReverseIterator& operator++() 		{ 			m_pData = m_pData->GetPrev();			return *this; 		}		ReverseIterator operator++( int ) 		{ 			ReverseIterator result( *this );			++*this;			return result;		}		ReverseIterator& operator--() 		{ 			m_pData = m_pData->GetNext();			return *this; 		}		ReverseIterator operator--( int ) 		{ 			ReverseIterator result( *this );			--*this;			return result;		}		T& operator*()		{			return m_pData->GetData();		}		const T& operator*() const		{			return m_pData->GetData();		}				bool operator!=( const ReverseIterator& i ) const		{			return m_pData != i.m_pData;		}		bool operator==( const ReverseIterator& i ) const		{			return m_pData == i.m_pData;		}			private:		DoubleNode<T> *m_pData;	} ;		Iterator Begin() const 	{		Iterator i( m_pHead );		return i;	}	Iterator End() const	{		Iterator i( NULL );		return i;	}	// Need these to support iterating from back to front	ReverseIterator RBegin() const 	{		ReverseIterator i( m_pTail );		return i;	}	ReverseIterator REnd() const	{		ReverseIterator i( NULL );		return i;	}	private:	DoubleNode<T> *m_pHead;	DoubleNode<T> *m_pTail;} ;#endif // INCLUDE_DATASTRUCTS

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -