队列:先进先出
代码实现:
#pragma once
#include <iostream>
template <typename T>
class CSLQueue
{
typedef struct ST_NODE {
T* pData;
ST_NODE* pNext;
}ST_SL_NODE;
public:
CSLQueue();
~CSLQueue();
bool EnQueue(T* pData);
//need to free memory in caller
T* DeQueue();
void Clear();
void Print();
private:
ST_SL_NODE* m_pHead;
ST_SL_NODE* m_pTail;
};
template <typename T>
CSLQueue<T>::CSLQueue():m_pHead(nullptr), m_pTail(nullptr)
{
}
template <typename T>
CSLQueue<T>::~CSLQueue()
{
Clear();
}
template <typename T>
bool CSLQueue<T>::EnQueue(T* pData)
{
if (pData == nullptr)
{
return false;
}
ST_SL_NODE* pNode = new ST_SL_NODE{nullptr, nullptr};
pNode->pData = new T;
*(pNode->pData) = *pData;
if (m_pTail)
{
m_pTail->pNext = pNode;
m_pTail = pNode;
}
else
{
m_pHead = m_pTail = pNode;
}
return true;
}
template <typename T>
T* CSLQueue<T>::DeQueue()
{
T* pData = nullptr;
if (m_pHead)
{
ST_SL_NODE* pNode = m_pHead;
m_pHead = m_pHead->pNext;
if (m_pHead == nullptr)
{
m_pTail = m_pHead;
}
pData = pNode->pData;
delete pNode;
pNode = nullptr;
}
return pData;
}
template <typename T>
void CSLQueue<T>::Clear()
{
while (m_pHead)
{
ST_SL_NODE* pNode = m_pHead;
m_pHead = m_pHead->pNext;
delete pNode->pData;
delete pNode;
}
m_pTail = m_pHead;
}
template <typename T>
void CSLQueue<T>::Print()
{
using namespace std;
ST_SL_NODE* pNode = m_pHead;
if (pNode == nullptr)
{
cout << "This is an empty queue!" << endl;
return;
}
while (pNode)
{
cout << *(pNode->pData) << endl;
pNode = pNode->pNext;
}
}
使用:
#include <iostream>
#include "queue.h"
using namespace std;
int main(int argc, char* argv[])
{
CSLQueue<int> oSLQueue;
cout << "*******Should print empty queue*******" <<endl;
oSLQueue.Print();
int* pNumList = new int[20];
for (int i = 0; i < 20; i++)
{
pNumList[i] = i;
}
cout << "*******Insert queue*******" << endl;
for (int i = 0; i < 20; i++)
{
oSLQueue.EnQueue(&pNumList[i]);
}
oSLQueue.Print();
cout << "*******Delete queue*******" << endl;
for (int i = 0; i < 20; i++)
{
int * pData = oSLQueue.DeQueue();
cout << "Delete "<< *pData << endl;
delete pData;
}
oSLQueue.Print();
return 0;
}
输出