模板實現簡易queue

    隊列提供了以下操作:

q.empty()                 //如果隊列爲空返回true,否則返回false
q.size()                  //返回隊列中元素的個數  
q.pop()                  //刪除隊列首元素的值,但不返回其值  
q.front()                 //返回隊列首元素的值,但不刪除其值
q.push()                                   //在隊尾壓入新元素
q.back()                                   //返回隊尾元素的值,但不刪除其值

模擬實現:

/*Queue.cpp*/

#include <iostream>

using namespace std;

template<class T>
struct Node
{
	Node(const T& d)
		:_data(d)
		,_next(NULL)
	{}
	T _data;
	struct Node* _next;
};
template<class T>
class LinkList
{
public:
	LinkList()
		:_head(NULL)
		,_tail(NULL)
	{}
	~LinkList()
	{
		if(_head == NULL)
		{
			cout<<"List is empty!!"<<endl;
			return;
		}
		Node<T>* cur = _head;
		while(cur != NULL)
		{
			Node<T>* del = cur;
			cur = cur->_next;
			delete del;
			del = NULL;
		}
		delete cur;
		_head = NULL;
		_tail = NULL;
	}
public:
	void Display()
	{
		Node<T>* cur = _head;
		while(cur)
		{
			cout<<cur->_data<<"-->";
			cur = cur->_next;
		}
		cout<<"Nvl."<<endl;
	}
	void PushBack(const T& d)
	{
		Node<T>* NewNode = new Node<T>(d);
		if(_head == NULL)
		{
			_head = NewNode;
			_tail = _head;
		}
		else
		{
			_tail->_next = NewNode;
			_tail = NewNode;
		}
	}
	void PopFront()
	{
		if(_head == NULL)
		{
			cout<<"Queue is empty!!"<<endl;
			return;
		}
		Node<T>* del =_head;
		_head = _head->_next;
		delete del;
		del = NULL;
	}
	int GetListLength()
	{
		Node<T>* cur =  _head;
		int count = 0;
		while(cur)
		{
			count++;
			cur = cur->_next;
		}
		return count;
	}
	T& GetHeadValue()
	{
		if(_head == NULL)
		{
			cout<<"Queue is empty!!"<<endl;
			exit(1);
		}
		return _head->_data;
	}
	T& GetTailValue()
	{
		if(_head == NULL)
		{
			cout<<"Queue is empty!!"<<endl;
			exit(1);
		}
		return _tail->_data;
	}
	bool JudgeIsEmpty()
	{
		if(_head == NULL)
		{
			return true;
		}
		return false;
	}
private:
	Node<T>* _head;
	Node<T>* _tail;
};

template<class T, class Container>
class Queue
{
public:
	void Show()
	{
		_con.Display();
	}
	void Push(const T& q)
	{
		_con.PushBack(q);
	}
	void Pop()
	{
		_con.PopFront();
	}
	int Size()
	{
		return _con.GetListLength();
	}
	const T& Front()
	{
		return _con.GetHeadValue();
	}
	const T& Back()
	{
		return _con.GetTailValue();
	}
	bool Empty()
	{
		return _con.JudgeIsEmpty();
	}
private:
	Container _con;
};

int main()
{
	Queue<int,LinkList<int> > q1;
	q1.Push(1);
	q1.Push(2);
	q1.Push(3);
	q1.Push(4);
	q1.Push(5);
	q1.Show();
	q1.Pop();
	q1.Show();
	int size = q1.Size();
	cout<<"size = "<<size<<endl;
	int retTail = q1.Back();
	cout<<"retTail = "<<retTail<<endl;
	int retHead = q1.Front();
	cout<<"retHead = "<<retHead<<endl;
	bool result = q1.Empty();
	cout<<"result = "<<result<<endl;
	system("pause");
	return 0;
}

結果:

wKiom1b6PmWzDhR7AAAMVEq7Alg070.png


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章