数据结构:队列Queue的实现与代码分析

队列Queue是先进进出FIFO和后进后出LILO的。

只能从队尾放入数据,从对头删除数据。

跟Stack一样,我也写了两个版本,但是跟Stack还是有所不同的。

用List实现的队列,是没有大小限制的,

用Vector实现的队列,是有大小限制的,其实更加复制,很多地方要注意的。使用循环列表的方式来实现的。

对于List和Vector,都是使用自己实现的简单模板。Vector模板的实现 List模板的实现

同样,也没有实现默认构造函数,复制构造函数,赋值运算符,析构函数这些。除了vector版本的队列,要初始化的时候确定队列的大小,才写了一个默认构造函数。

//  
//  Queue.h  
//  HelloWorld  
//  csdn blog:http://blog.csdn.net/u012175089  
//  Created by feiyin001 on 17/1/9.  
//  Copyright (c) 2017年 FableGame. All rights reserved.  
//  

#ifndef __HelloWorld__Queue__  
#define __HelloWorld__Queue__  

#include "Fable/List.h"  
#include "Fable/Vector.h"  


namespace Fable
{
	//队列,使用链表来实现,没有队列大小的限制
	template<typename Object>
	class Queue
	{
	public:
		//把数据放入队列尾
		void push_back(const Object& obj)
		{
			_list.push_back(obj);//把数据放到链表末尾  
		}
		//把队头数据删除
		void pop_front()
		{
			_list.pop_front();//弹出list的末尾的数据  
		}
		//获得队首的数据
		Object& front()
		{
			return _list.front();//获得list最后的数据  
		}
		//判断为空  
		bool empty()
		{
			return _list.empty();//直接返回list是否为空  
		}
		//获得队列的大小  
		int size()
		{
			return _list.size();//返回list的大小  
		}

	private:
		List<Object> _list;//链表实现  
	};

	//队列:用vector实现的队列,是固定大小的,满了就不能插入数据了
	template<typename Object>
	class FixedQueue
	{
	public:
		//初始化
		FixedQueue(int capacity = 10) 
		{
			_queueCapacity = capacity;//需要设置队列的总长度
			for (int i = 0; i < capacity; ++ i)
			{
				_theArray.push_back(i);//因为没有写vector的对应的初始化函数,所以需要在这里逐个插入
			}
			_head = -1;//没有地方可以指向,只能是-1了。
			_tail = -1;//没有地方可以指向,只能是-1了。
		}
		//在队尾插入数据  
		bool push_back(const Object& obj)
		{
			if (full())//满了就不能插入了
			{
				return false;
			}
			if (empty())//如果队伍是空的话,队首要指向最新的数据的位置
			{
				_head = (_head + 1) % _queueCapacity;
			}
			_queueSize++;//队伍数据量加1
			_tail = (_tail + 1) % _queueCapacity;//队尾指针+1,超过最大的就要从0开始
			_theArray[_tail];//把数据放到队尾指针的位置  
			return true;
		}
		//弹出队首数据  
		void pop_front()
		{
			_head = (_head + 1) % _queueCapacity;//head指针向前走,超过最大的就要从0开始
			_queueSize--;//队伍数据量-1
		}
		//返回队首的数据  
		Object& front()
		{
			return _theArray[_head];//返回_head的数据 
		}
		//判断队伍是否为空  
		bool empty()
		{
			return _queueSize == 0;//队列大小为0
		}
		//返回队列的大小  
		int size()
		{
			return _queueSize;
		}
		//判断队列是否满了
		bool full()
		{
			return _queueSize == _queueCapacity;//如果队列大小跟总容量一样,就是满了
		}
	private:
		int _queueSize;//队列当前数据量的大小
		int _head;//指向队首数据,除非队列为空,否则是指向有效数据的
		int _tail;//指向队尾数据,除非队列为空,否则是指向有效数据的
		int _queueCapacity;//队列容量的大小,最多能放多少个数据
		Vector<Object> _theArray;//vector实现
	};
}
#endif /* defined(__HelloWorld__Queue__) */  
再看看简单的测试程序:

//  
//  main.cpp  
//  HelloWorld  
//  csdn blog:http://blog.csdn.net/u012175089  
//  Created by feiyin001 on 17/01/04.  
//  Copyright (c) 2016年 Fable. All rights reserved.  
//  

#include "Queue.h"   
#include <iostream>  

using namespace Fable;

int main(int argc, char* argv[])
{
	Queue<int> q;
	for (int i = 0; i < 10; i++)
	{
		q.push_back(i);
	}
	while (!q.empty())
	{
		std::cout << q.front() << std::endl;
		q.pop_front();
	} 

	FixedQueue<int>fq(20);
	for (int i = 0; i < 10; i++)
	{
		fq.push_back(i);
	}
	for (int i = 0; i < 13; i++)
	{
		fq.pop_front();
		fq.push_back(i);
	}
	while (!fq.empty())
	{
		std::cout << fq.front() << std::endl;
		fq.pop_front();
	}
	return 0;
}



posted @ 2017-01-09 11:50  肥宝游戏  阅读(205)  评论(0编辑  收藏  举报