队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
实现思路:
LinkQueue.h
#pragma once
#include<iostream>
template<class T>
class LinkQueue
{
private:
struct Node
{
T data;
struct Node *next;
};
Node *first,*last;//队列开头,队列尾
public:
void enqueue(T data);//入队
T dequeue();//出队
bool isEmpty();
int size();//获取队列大小
void clear();//清空队列
LinkQueue();
~LinkQueue(void);
};
template<class T>
LinkQueue<T>::LinkQueue()
{
this->first=nullptr;
this->last=nullptr;
}
template<class T>
LinkQueue<T>::~LinkQueue(void)
{
this->clear();
}
template<class T>
void LinkQueue<T>::enqueue(T data)
{
Node *tmp= new Node;
tmp->data=data;
tmp->next=nullptr;
if(first==nullptr)
{
first=tmp;
last=tmp;
}
else
{
last->next=tmp;
last=tmp;
}
}
template<class T>
T LinkQueue<T>::dequeue()
{
Node *tmp;
T data;
if(first==nullptr)
{
return 0;
}
else
{
tmp=this->first;
this->first=this->first->next;
data=tmp->data;
delete tmp;
return data;
}
}
template<class T>
void LinkQueue<T>::clear()
{
Node *tmp;
while(first!=nullptr)
{
tmp=this->first;
this->first=this->first->next;
delete tmp;
}
this->first=nullptr;
this->last=nullptr;
}
template<class T>
int LinkQueue<T>::size()
{
int size=0;
Node *p=this->first;
while(p!=nullptr)
{
size++;
p=p->next;
}
return size;
}
template<class T>
bool LinkQueue<T>::isEmpty()
{
return first==nullptr;
}
test.cpp
#include"LinkQueue.h"
#include<iostream>
using namespace std;
void main()
{
LinkQueue<int> qu;
for(int i=0;i<10;i++)
{
qu.enqueue(i);
}
cout<<"size:"<<qu.size()<<endl;
while(!qu.isEmpty())
{
cout<<qu.dequeue()<<endl;
}
cin.get();
}
运行结果: