数据结构:队列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; }
人生如戏,还是戏如人生?微信公众号:传说之路
csdn博客 http://blog.csdn.net/u012175089/article/list/2