// 環境:vs2010
// 代碼比較少,所以直接一個源文件
#include <iostream>
using namespace std;
template <class DataType>
struct Node //結點結構
{
DataType data;
Node<DataType>* next;
};
template <class DataType>
class LinkQueue
{
public:
LinkQueue();//構建空隊列
~LinkQueue();//撤銷隊列
void EnQueue(DataType x);//x進隊
DataType DeQueue( ); //出隊並將出隊元素返回
DataType GetQueue( );//獲取隊頭元素
bool Empty( );//隊空判斷
private:
Node<DataType>* front;//隊頭指針,指向附加結點,隊頭元素爲附加結點後的第一個結點
Node<DataType>* rear;//隊尾指針,隊尾元素爲隊尾指針所指結點
};
template <class DataType>
LinkQueue<DataType>::LinkQueue()
{
front=new Node<DataType>;
front->next =NULL;
rear=front;
}
template <class DataType>
LinkQueue<DataType>::~LinkQueue()
{
while(front)
{
Node<DataType>* p=front;
front=front->next ;
delete p;
}
}
template <class DataType>
void LinkQueue<DataType>::EnQueue(DataType x)
{
Node<DataType>* s=new Node<DataType>;
s->data =x;
s->next =NULL;
rear->next =s;//進隊
rear=s;//修改尾指針
}
template <class DataType>
DataType LinkQueue<DataType>::DeQueue( )
{
if(Empty())throw "空隊,溢出";
Node<DataType>* p=front->next ;
DataType x=p->data ;
front->next =p->next ;//出隊
if(p->next ==NULL)rear=front;//刪除一個元素時需修改尾指針
delete p;//刪除出隊元素
return x;//出隊元素返回
}
template <class DataType>
DataType LinkQueue<DataType>::GetQueue( )
{
if(Empty())throw "空隊,溢出";
return front->next ->data ;
}
template <class DataType>
bool LinkQueue<DataType>::Empty( )
{
if(front==rear)return true;
else return false;
}
void main()
{
LinkQueue<int> mylinkqueue;
int a[]={1,2,3,4,5};
for(int i=0;i<5;i++)
{
cout<<"進隊元素="<<a[i]<<endl;
mylinkqueue.EnQueue(a[i]);
}
cout<<"隊頭元素="<<mylinkqueue.GetQueue()<<endl;
while(!mylinkqueue.Empty())
{
cout<<"出隊元素="<<mylinkqueue.DeQueue()<<endl;
}
}