队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
模拟代码:
#include <iostream>
using namespace std;
#include <assert.h>
template<class T>
struct QueueNode
{
T _Data;
QueueNode<T>* _Next;
};
template<class T> //栈一般用数组实现 ----队列一般用链表实现
class Queue
{
typedef QueueNode<T> Node;
public:
Queue()
:_Head(NULL)
,_Tail(NULL)
{}
void Push(const T& x)
{
if (_Head == NULL)
{
_Head = new Node;
_Head->_Data = x;
_Tail = _Head;
}
else
{
Node* Tmp = new Node;
Tmp->_Data = x;
Tmp->_Next = NULL;
_Tail->_Next = Tmp;
_Tail = _Tail->_Next;
}
}
void Pop() //从头删
{
assert(_Head != NULL);
Node* cur = _Head;
_Head = _Head->_Next;
delete cur;
cur = NULL;
}
bool Empty()
{
if (_Head == NULL)
{
return true;
}
return false;
}
size_t Size()
{
size_t count = 0;
if (_Head == _Tail) //只有一个结点
{
if (_Head == NULL)
{
return 0;
}
return 1;
}
else
{
Node* cur = _Head;
while (cur)
{
count++;
cur = cur->_Next;
}
return count;
}
}
T& front() //返回队头元素
{
assert(_Head != NULL);
return _Head->_Data;
}
T& Back()
{
assert(_Tail != NULL);
return _Tail->_Data;
}
private:
Node* _Head;
Node* _Tail;
};
void Funtest()
{
Queue<int> a;
a.Push(1);
a.Push(2);
cout<<a.Size();
a.Push(3);
a.Push(4);
a.Pop();
a.Push(5);
cout<<a.Size();
}