您的位置:首页 > 其它

链队列

2016-01-15 16:43 141 查看
采用一个不带头结点,只有一个尾结点指针rear的循环单链表存储队列,设计出这种队列的进队,出队,判断队空和求队中元素个数的算法
#ifndef __LINKQUEUE_H_
#define __LINKQUEUE_H_

#include <iostream>
using namespace std;

template<class T>
struct LinkNode
{
T data;
LinkNode *next;
};
//
template<class T>
class LinkQueueClass
{
public:
LinkQueueClass();
~LinkQueueClass();
bool QueueEmpty();
bool enQueue(T e);
bool deQueue(T &e);
int GetCount();
private:
LinkNode<T> *rear;
};
//
template<class T>
LinkQueueClass<T>::LinkQueueClass()
{
rear = NULL;
}
//
template<class T>
LinkQueueClass<T>::~LinkQueueClass()
{
LinkNode<T> *pre,*p;
pre = rear;
p = pre->next;
if(rear == NULL)            //空队列直接返回
return ;
while(p != rear)
{
delete pre;
pre = p;
p = p->next;
}
delete pre;
}
//
template<class T>
bool LinkQueueClass<T>::QueueEmpty()
{
if(rear == NULL)
return true;
else
return false;
}
//
template<class T>
bool LinkQueueClass<T>::enQueue(T e)
{
LinkNode<T> *pre,*p;
p = new LinkNode<T>;
p->data = e;
if(rear == NULL)            //原链队为空
{
rear = p;
p->next = p;            //构成循环队列
}
else
{
p->next = rear->next;
rear->next = p;
rear = p;
}
}
//
template<class T>
bool LinkQueueClass<T>::deQueue(T &e)
{
LinkNode<T> *pre,*p;
if(rear == NULL)            //空队列,返回false
return false;
else if(rear->next == rear) //只有一个结点
{
e = rear->data;
delete rear;
rear = NULL;
}
else                        //有多个结点
{
p = rear->next;
e = p->data;
rear->next = p->next;
delete p;
}
return true;
}
//
template<class T>
int LinkQueueClass<T>::GetCount()
{
LinkNode<T> *p = rear;
if(rear == NULL)
return 0;
p = rear->next;
int i = 1;
while(p!=rear)
{
++i;
p = p->next;
}
return i;
}
#endif // __LINKQUEUE_H_

#include "LinkQueue.h"

int main()
{
LinkQueueClass<char> LQ;

LQ.enQueue('a');
LQ.enQueue('b');
LQ.enQueue('c');
LQ.enQueue('d');

cout<<LQ.GetCount()<<endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: