定义
使用链表描述队列时,通常包含以下几个基本要素:
- 队头指针(Front Pointer):指向队列中第一个(即最早进入队列的)元素的节点。
- 队尾指针(Rear Pointer):指向队列中最后一个(即最近进入队列的)元素的节点。
- 节点(Node):每个节点包含数据域和指向下一个节点的指针。
队列的基本操作包括:
- 入队:在队尾添加新元素。
- 出队:移除队头元素。
- 查看队头元素:获取队头元素但不移除它。
- 检查队列是否为空:判断队头指针是否为空或者判断size是否为0。
抽象类queue
template<typename T>
class queue
{
public:
virtual ~queue(){}
virtual bool empty() const = 0;
virtual int size() const = 0;
virtual T& font() const = 0;
virtual T& back() const = 0;
virtual void push(const T& theElement) const = 0;
virtual void pop() = 0;
};
派生类linkQueue
template<typename T>
class linkQueue : public queue<T>
{
public:
linkQueue();
~linkQueue();
bool empty() const;
int size() const;
T &font() const;
T &back() const;
void push(const T &theElement);
void pop();
private:
linkNode<T>* fontNode;
linkNode<T>* backNode;
int queueSize;
};
template<typename T>
linkQueue<T>::linkQueue()
{
fontNode = nullptr;
backNode = nullptr;
queueSize = 0;
}
template<typename T>
linkQueue<T>::~linkQueue()
{
while(!empty())
{
pop();
}
}
template<typename T>
bool linkQueue<T>::empty() const
{
return queueSize == 0;
}
template<typename T>
int linkQueue<T>::size() const
{
return queueSize;
}
template<typename T>
T &linkQueue<T>::font() const
{
assert(fontNode != nullptr);
return *fontNode;
}
template<typename T>
T &linkQueue<T>::back() const
{
assert(backNode != nullptr);
return *backNode;
}
template<typename T>
void linkQueue<T>::push(const T &theElement)
{
auto newNode = new linkNode<T>(theElement,nullptr);
if(queueSize == 0)
{
fontNode = newNode;
}
else
{
backNode->next = newNode;
}
backNode = newNode;
queueSize++;
}
template<typename T>
void linkQueue<T>::pop()
{
assert(queueSize > 0);
auto nextNode = fontNode->next;
delete fontNode;
fontNode = nextNode;
queueSize--;
}