当前位置: 首页 > news >正文

数据结构:队列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;
}



转载于:https://www.cnblogs.com/fablegame/p/6430211.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【bzoj2333】 SCOI2011—棘手的操作
  • java各数据类型之间的转换
  • Android笔记(三):View一些值得注意的地方
  • java常用正则表达式
  • Ubuntu 检测到系统出现问题 弹窗 嘿嘿
  • 日期年月日正则表达式
  • 最近一周的日期选择设置
  • hibernate增加,删除,修改,查找操作
  • javaWEB总结(17):cookie概述
  • flex获得当前player版本信息
  • Struts入门(二) 配置文件的讲解
  • flex rpc 错误整理
  • 提高网页关键词排名的实用方法
  • 疯狂Java讲义(十一)---- 初始化块
  • java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver
  • 【刷算法】从上往下打印二叉树
  • Angularjs之国际化
  • extract-text-webpack-plugin用法
  • IP路由与转发
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • scrapy学习之路4(itemloder的使用)
  • 机器学习 vs. 深度学习
  • 免费小说阅读小程序
  • 面试总结JavaScript篇
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 一天一个设计模式之JS实现——适配器模式
  • 用Python写一份独特的元宵节祝福
  • Spring第一个helloWorld
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​业务双活的数据切换思路设计(下)
  • #1015 : KMP算法
  • #Linux(Source Insight安装及工程建立)
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #微信小程序:微信小程序常见的配置传值
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • $(function(){})与(function($){....})(jQuery)的区别
  • (13):Silverlight 2 数据与通信之WebRequest
  • (8)STL算法之替换
  • (PADS学习)第二章:原理图绘制 第一部分
  • (void) (_x == _y)的作用
  • (zhuan) 一些RL的文献(及笔记)
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (离散数学)逻辑连接词
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (十六)串口UART
  • (算法)Game
  • (五)activiti-modeler 编辑器初步优化
  • (一)Linux+Windows下安装ffmpeg
  • .NET C# 使用 iText 生成PDF
  • .NET Micro Framework初体验
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .Net Remoting(分离服务程序实现) - Part.3