使用链表实现队列和堆栈不一样的地方在于:
需要另外的一个指针指向队列尾部。
每次Push()在链表尾部进行。
每次Pop()则在链表头部进行。
同样,在查看队列头尾元素时(Front()、Back()),对队列进行判空操作
由调用者进行。
源代码
MyQueue.h
#include <iostream>
struct ListNode
{
int nData;
ListNode* pNext;
};
class MyQueue
{
public:
MyQueue() : m_pHead(NULL), m_pTail(NULL) {}
void Push(int data);
void Pop();
int Front();
int Back();
bool Empty();
private:
ListNode* m_pHead;
ListNode* m_pTail;
};
MyQueue.cpp
#include "MyQueue.h"
// 在链表尾部插入
void MyQueue::Push(int data)
{
ListNode* pNew = new ListNode;
pNew->nData = data;
pNew->pNext = NULL;
// 插入第一个元素时,
// 两指针均指向新元素
if (NULL == m_pTail)
{
m_pTail = pNew;
m_pHead = pNew;
}
else
{
m_pTail->pNext = pNew;
m_pTail = pNew;
}
}
int MyQueue::Back()
{
return m_pTail->nData;
}
// 在链表头部弹出
void MyQueue::Pop()
{
ListNode* pPop = m_pHead;
m_pHead = m_pHead->pNext;
delete pPop;
// 弹出最后一个元素时,两指针均置空
if (NULL == m_pHead)
m_pTail = NULL;
}
int MyQueue::Front()
{
return m_pHead->nData;
}
bool MyQueue::Empty()
{
return NULL == m_pHead || NULL == m_pTail;
}