为了操作方便,为链队列添加一个“头结点”,并约定头指针始终指向这个附加的头结点,尾指针指向队列尾结点。读者注意“出队列”算法中的特殊情况。当队列中只有一个结点时(此时队尾指针指向该结点),出队列操作将“丢失”队尾指针。因此在这种情况下,尚需修改队尾指针,令它指向头结点。
/*
Filename: LinkQueue.h
Description: Using linked storage structure to achieve queue.
Date: November 20, 2012
*/
#ifndef LINKQUEUE_H
#define LINKQUEUE_H
#include <iostream>
using namespace std;
template<class T> class LinkQueue;
template<class T>
class QueueNode
{
friend class LinkQueue<T>;
public:
QueueNode()
{
next = NULL;
}
QueueNode(T item)
{
data = item;
next = NULL;
}
~QueueNode()
{
}
private:
T data;
QueueNode<T> *next;
};
template<class T>
class LinkQueue
{
public:
LinkQueue() //构造一个只含头结点的队列
{
front = rear = new QueueNode<T>;
}
~LinkQueue()
{
}
public:
void EnQueue_L(T elem); //入队列
bool DeQueue_L(T &return_elem); //出队列
void DestoryQueue_L(); //销毁队列
T GetHead();
void Print();
private:
QueueNode<T> *front;
QueueNode<T> *rear;
};
template<class T>
void LinkQueue<T>::EnQueue_L(T elem)
{
QueueNode<T> *newNode = new QueueNode<T>(elem);
rear->next = newNode;
rear = newNode;
}
template<class T>
bool LinkQueue<T>::DeQueue_L(T &return_elem)
{
if (front == rear)
{
return false;
}
QueueNode<T> *tempNode = front->next;
return_elem = tempNode->data;
front->next = tempNode->next;
if (rear == tempNode)
{
rear = front;
}
delete tempNode;
return true;
}
template<class T>
void LinkQueue<T>::DestoryQueue_L()
{
while (front)
{
rear = front->next;
delete front;
front = rear;
}
}
template<class T>
T LinkQueue<T>::GetHead()
{
return front->next->data;
}
template<class T>
void LinkQueue<T>::Print()
{
if (rear != front)
{
QueueNode<T> *tempNode = front->next;
while (tempNode != rear)
{
cout << tempNode->data << " ";
tempNode = tempNode->next;
}
cout << tempNode->data << endl;
}
else
{
cout << "队列为空!" << endl;
}
}
#endif
#include "LinkQueue.h"
int main()
{
LinkQueue<int> Lq;
Lq.EnQueue_L(1);
Lq.EnQueue_L(3);
Lq.EnQueue_L(5);
Lq.EnQueue_L(7);
Lq.Print();
cout << "队列头元素:" << Lq.GetHead() << endl;
cout << "------------------------" << endl;
int data;
cout << "出队列:" << Lq.DeQueue_L(data) << endl;
Lq.Print();
cout << "队列头元素:" << Lq.GetHead() << endl;
cout << "------------------------" << endl;
Lq.DestoryQueue_L();
Lq.Print();
system("pause");
return 0;
}
我也是一个刚学习数据结构算法的新手,如果发表的文章有什么错误或者更好建议的地方,请大家踊跃指出来,我表示感谢.....