队列
1、队列值允许在表的队尾进行插入,在表对头进行删除。队列具有先进先出的特性。(队尾入数据,队头出数据)
2、具体实现(单链表)
节点定义:
template<class T>
struct Node
{
public:
Node(const T& x)
:_data(x)
,_next(NULL)
{}
public:
T _data;
Node<T>* _next;
};
函数声明:
template<class T>
class Queue
{
public:
Queue();
~Queue();//析构函数不能光声明不定义,这样编译不通过,切记
public:
void Push(const T& x);
void Pop();
bool Empty();
size_t Size();
T& Front();
T& Back();
protected:
void Clear();
protected:
Node<T>* _head;
Node<T>* _tail;
size_t _size;
};
函数定义:
template<class T>
Queue<T>::Queue()
:_head(NULL)
, _tail(NULL)
{
cout << "Queue()" << endl;
}
template<class T>
void Queue<T>::Clear()
{
Node<T>* cur = _head;
while (cur!=NULL)
{
Node<T>* del = cur;
cur = cur->_next;
delete del;
}
_head = NULL;
_tail = NULL;
_size = 0;
}
template<class T>
Queue<T>::~Queue()
{
cout << "~Queue" << endl;
Clear();
}
template<class T>
void Queue<T>::Push(const T& x)
{
if (_head == NULL)
{
_head = _tail = new Node<T>(x);
}
else
{
_tail->_next = new Node<T>(x);
_tail = _tail->_next;
}
++_size;
}
template<class T>
void Queue<T>::Pop()
{
assert(_head != NULL);
if (_head == _tail)
{
delete _head;
_head = _tail = NULL;
}
else
{
Node<T>* del = _head;
_head = _head->_next;
delete del;
}
--_size;
}
template<class T>
bool Queue<T>::Empty()
{
return _head == NULL;
}
template<class T>
size_t Queue<T>::Size()
{
return _size;
}
template<class T>
T& Queue<T>::Front()
{
assert(_head);
return _head->_data;
}
template<class T>
T& Queue<T>::Back()
{
assert(_tail != NULL);
return _tail->_data;
}