h文件
#ifndef _Q_H
#define _Q_H
template<class Object>
class Queue
{
public:
Queue();//构造函数
~Queue();//析构函数
bool isEmpty() const;//判断队列是不是空的
const Object & getFront() const;//取数据出来,并不删除
void enqueue(const Object & x);//入队
Object dequeue();//出队
void makeEmpty();//队列空
private:
struct ListNote
//结点,struct,也可以用class,此处用class默认是私有的,会出错
//如果是数据结构就用struct,对象就用class
{
Object element;//数据
ListNote *next;//指向下一个
ListNote(const Object & theElement, ListNote *n = 0)
:element(theElement), next(n){}
};
ListNote *front;
ListNote *back;
};
template<class Object>//构造函数
Queue<Object>::Queue()
{
front = back = 0;
}
template<class Object>//析构函数
Queue<Object>::~Queue()
{
makeEmpty();
}
template<class Object>
void Queue<Object>::makeEmpty()
{
while (!isEmpty())
dequeue();//如果不是空的,就一直删除到空为止
//不删除内存。就会产生内存泄漏
}
template<class Object>
bool Queue<Object>::isEmpty() const//队列是空的
{
return front == 0;
}
template<class Object>//把队首的数据读出来
const Object & Queue<Object>::getFront() const
{
if (isEmpty())
throw "queue is empty";
return front->element;
}
template<class Object>//数据放入队列
void Queue<Object>::enqueue(const Object &x)
{
if (isEmpty())
back = front = new ListNote(x);//只有一个节点
else
back = back->next = new ListNote(x);//back指向下一个
}
template<class Object>
Object Queue<Object>::dequeue()//删除队首
{
Object frontItem = getFront();//要删除的节点
ListNote *old = front;
front = front -> next;//指针指向下一个
delete old;//对应入队的new
return frontItem;//数据返回
}
#endif
c文件
#include<iostream>
#include "Q.h"
using namespace std;
int main()
{
//先进先出
cout << "ok" << endl;
Queue<int> myQ;
myQ.enqueue(10);
myQ.enqueue(20);
myQ.enqueue(30);
cout << myQ.getFront() << endl;
cout << myQ.getFront() << endl;
myQ.dequeue();//队首取出来
cout << myQ.getFront() << endl;
myQ.dequeue();
cout << myQ.getFront() << endl;
system("pause");
return 0;
}