链队列最大的优点便是不用担心上溢,因此也不存在假象溢出,基本语法和链栈大同小异
没看过的朋友可以参考一下之前的链栈
也没什么特别的,直接上代码吧OvO,一些细节上的问题已经注释好了
#include<iostream>
using namespace std;
template<typename T>
struct Node
{
T data;
Node* next;
};
template<typename T>
class LinkQueue
{
Node<T>* front,*rear;
public:
LinkQueue();
~LinkQueue();
void EnQueue(T Data);
void DeQueue();
T GetQueue();
bool isEmpty();
};
template<typename T>
LinkQueue<T>::LinkQueue()//这里我将两个指针都初始化为NULL,与常规的方法不太一样,没有设置头结点,因此后面判断队空的条件变为了front==NULL
{
front= NULL;
rear = NULL;
}
template<typename T>
LinkQueue<T>::~LinkQueue()
{
while (front != NULL)
{
Node<T>* p = front;
front = front->next;
delete p;
}
}
template<typename T>
void LinkQueue<T>::EnQueue(T Data)
{
if (front == rear&&front == NULL)//由于没有设置头结点,因此入队时要分front为空和不为空两种情况
{
front = new Node<T>;
front->data = Data;
rear = front;
}
else
{
Node<T>* newnode = new Node<T>;
newnode->data = Data;
newnode->next = NULL;
rear->next = newnode;
rear = newnode;//将队尾修改为新入队的节点
}
}
template<typename T>
void LinkQueue<T>::DeQueue()
{
if (front == NULL)//这里入队条件改成了front==NULL
{
cout << "队空" << endl;
return;
}
Node<T>* p = front;
cout << p->data << endl;
front = front->next;
delete p;
}
template<typename T>
T LinkQueue<T>::GetQueue()
{
if (front== NULL)
{
cout << "队空" << endl;
return -1;
}
return front->data;
}
template<typename T>
bool LinkQueue<T>::isEmpty()
{
if (front == NULL)
return true;
else
return false;
}
int main()
{
LinkQueue<int> a;
a.EnQueue(1);
a.EnQueue(2);
a.EnQueue(3);
a.DeQueue();
cout<<a.GetQueue()<<endl;
a.DeQueue();
cout << a.GetQueue() << endl;
if (a.isEmpty())
cout << "队为空" << endl;
}