队列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;
}