队列的实现:链式队列

    队列常常也使用链式存储的方式来实现。为了方便操作,同顺序存储一样,我们要维护一个头指针和一个尾指针。如下图:

队列的实现:链式队列_第1张图片

在链式队列中显然不会出现假溢出的情况。但在出队时,要及时释放内存。由于在队列的实现:顺序队列中,对队列的描述已经很清楚了。就闲话不多说,直接上代码:

类定义和类实现

#include<iostream>
#include<iomanip>
using namespace std;
typedef int ELemType;
class QNode   //节点类型  
{
	public:
	ELemType data;
	QNode *next;
	QNode(ELemType v, QNode*p=NULL):data(v),next(p){};
};
class LinkQueue  //链式队列 
{
	private:
	int size;
	QNode *front;   //头指针 
	QNode *rear;    //尾指针 
	public:
	LinkQueue();    //默认构造方法 
	~LinkQueue();   //析构 
	int getSize();     //链表大小 
	bool getFront(ELemType&);  //获取头节点 
	bool getRear(ELemType&);   //获取尾节点
	bool empty();      //队列是否为空 
	void clear();      //清空链表 
	void enQueue(ELemType);   //入队 
	void deQueue();    //出队  
	void queueTraverse();   //队列遍历 
};
//类实现
LinkQueue::LinkQueue()
{
	front=rear=NULL;
	size=0;
}
LinkQueue::~LinkQueue()
{
	clear();
} 
int LinkQueue::getSize()
{
	return size;
}
bool LinkQueue::getFront(ELemType &item)
{
	if(front)
	{
		item=front->data;
		return true;
	}
	cout<<"空队列!"<<endl;
	return false;
}
bool LinkQueue::getRear(ELemType &item)
{
	if(rear)
	{
		item=rear->data;
		return true;
	}
	cout<<"空队列!"<<endl;
	return false;	
}
bool LinkQueue::empty()
{
	return size==0;
}
void LinkQueue::clear()
{
	if(front)
	{
		QNode *q,*p=front;
		while(p)
		{
			q=p->next;
			delete p;
			p=q;
		}
	}
	rear=NULL;   //这一句,不能忘了  
	size=0;
}
void LinkQueue::enQueue(ELemType data)
{
	if(front)
	{
		rear->next=new QNode(data,NULL);
		rear=rear->next;
	}
	else
	{
		front=rear=new QNode(data,NULL);
	}
	size++;
}
void LinkQueue::deQueue()
{
	if(front)
	{
		QNode* p=front;
		front=front->next;
		delete p;
		size--;
	}
}
void LinkQueue::queueTraverse()
{
	if(front)
	{
		QNode *p=front;
		while(p)
		{
			cout<<setw(4)<<p->data;
			p=p->next;
		}
		cout<<endl;
	}
	else
	cout<<"队列为空!"<<endl;
}
主函数

int main()
{
	cout<<"链式队列演示"<<endl;
	LinkQueue queue;
	ELemType item;
	cout<<"入队,输入0结束:";
	while(cin>>item && item)
		queue.enQueue(item);
	cout<<"遍历"<<endl;
	queue.queueTraverse();
	if(queue.getFront(item))
	cout<<"获取队头元素:"<<item<<endl;
	if(queue.getRear(item))
	cout<<"获取队尾元素:"<<item<<endl;	
	cout<<"队头出队!"<<endl;
	queue.deQueue();
	cout<<"遍历"<<endl;
	queue.queueTraverse();
	queue.clear();
	cout<<"清空队列后,是否为空:";	
	if(queue.empty())
	cout<<"Yes!"<<endl;
	else
	cout<<"No!"<<endl;	
	system("pause");
	return 0;
}
运行:

队列的实现:链式队列_第2张图片

完整代码下载:队列的实现:链式队列

专栏目录看这里:

  • 数据结构与算法目录
  • c指针




你可能感兴趣的:(类,链表,队列,指针,链式存储)