队列的链式存储
队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出,我们把它简称为链队列。
队头指针指向链队列的头结点,队尾指针指向终端节点。
#include<iostream>
using namespace std;
template<class T>
class node
{
public:
T data;
node<T> * next;
};
template<class T>
class linkqueue {
private:
node<T>* front;
node<T>* rear;
int count;
public:
linkqueue(); //初始化
~linkqueue(); //析构
bool enqueue(T e);//入队
bool dequeue(T &e);//出队
void clear_queue();//清空队列
int length_queue();//队列长度
void print();//输出队列
};
//初始化
template<class T>
linkqueue<T>::linkqueue()
{
//this->front->next = NULL;
//this->rear = NULL;
this->front = this->rear = new node<T>;
this->front->next = NULL;
this->count = 0;
}
//析构
template<class T>
linkqueue<T>::~linkqueue()
{
}
//入队
template<class T>
bool linkqueue<T>::enqueue(T e)
{
node<T>* pnode = new node<T>;
pnode->data = e;
pnode->next = NULL;
this->rear->next= pnode;
this->rear = pnode;
this->count++;
return true;
}
//出队
template<class T>
bool linkqueue<T>::dequeue(T &e)
{
if (this->front==this->rear)
{
cout << "队空,无法出队" << endl;
return false;
}
else
{
node<T> *p;
p = this->front->next;
e = p->data;
this->front->next= p->next;
if (p == this->rear)//如果队头是队尾,则删除节点后,需要将rear指向头结点
{
this->rear = this->front;
}
delete p;
return true;
this->count--;
}
}
//清空队列
template<class T>
void linkqueue<T>::clear_queue()
{
while (this->front->next)
{
node<T>* p = this->front->next;
this->front->next = p->next;
delete p;
}
this->count = 0;
}
//队列长度
template<class T>
int linkqueue<T>::length_queue()
{
return this->count;
}
template<class T>
//输出队列
void linkqueue<T>:: print()
{
if (this->count != 0)
{
node<T>*s = this->front;
while (s != this->rear)
{
cout << s->next->data << " ";
s = s->next;
}
cout << endl;
}
else
cout << "队列为空" << endl;
}
//测试
int main()
{
linkqueue<int> sq;
int e = 0;
for(int i=0;i<38;i++)
{
sq.enqueue(i);
}
sq.print();
cout << sq.length_queue ()<< endl;
for (int i = 0; i < 5; i++)
sq.dequeue(e);
sq.print();
sq.clear_queue();
sq.print();
system("pause");
return 0;
}