基于List实现适配器queue(链式队列)
来源:互联网 发布:手机图标更换软件 编辑:程序博客网 时间:2024/06/05 22:37
队列遵循先进先出,后进后出的原则,它有两个出口,从最底端加入元素、取得最顶端的元素。实现队列我们通常建立在链表的基础上。下来我们利用之前实现过的容器List中的一部分接口来实现queue
(在这里分别用了模板参数和模板的模板参数两种方式来实现来实现)
queue.h
#pragma once#include "List.h"//模板参数template<class T,class Container=List<T>>class Queue1{public: Queue1() {} void Push(const T& data) { s.PushBack(data); } void Pop() { s.PopFront(); } bool Empty() { return s.Empty(); } size_t Size() { return s.Size(); } T& Front() { return s.Front(); } const T& Front()const { return s.Front(); } T& Back() { return s.Back(); } const T& Back()const { return s.Back(); }private: List<T> s;};//模板的模板参数template<class T, template<class> class Container = List>class Queue2{public: Queue2() {} void Push(const T& data) { s.PushBack(data); } void Pop() { s.PopFront(); } bool Empty() { return s.Empty(); } size_t Size() { return s.Size(); } T& Front() { return s.Front(); } const T& Front()const { return s.Front(); } T& Back() { return s.Back(); } const T& Back()const { return s.Back(); }private: List<T> s;};
List.h
#define _CRT_SECURE_NO_WARNINGS 1#pragma once#include <stdlib.h>#include <iostream>using namespace std;template<class T>struct ListNode{ ListNode(const T& data = T()) : _pPre(0) , _pNext(0) , _data(data) {} ListNode<T>* _pPre; ListNode<T>* _pNext; T _data;};template<class T,class Ref,class Ptr>class ListIterator{ typedef ListIterator<T, Ref, Ptr> Self;public: ListIterator() :_pCur(0) {} ListIterator(ListNode<T>* pCur) : _pCur(pCur) {} ListIterator(const Self& s) : _pCur(s._pCur) {} Ref operator*() { return _pCur->_data; } Ptr operator->() { return &(operator*()); //return &(_pCur->_data); } Self& operator++() { _pCur = _pCur->_pNext; return*this; } Self operator++(int) { Self temp(*this); _pCur = _pCur->_pNext; return temp; } Self& operator--() { _pCur = _pCur->_pPre; return*this; } Self operator--(int) { Self temp(*this); _pCur = _pCur->_pPre; return temp; } bool operator!=(const Self& s) { return _pCur != s._pCur; } bool operator==(const Self& s) { return _pCur == s._pCur; } ListNode<T>* _pCur;};template <class T>class List{public: typedef ListIterator<T, T&, T*> Iterator; typedef ListNode<T> Node;public: List() : _pHead(new Node) { _pHead->_pNext = _pHead;//带头节点的循环链表 _pHead->_pPre = _pHead; } // 1 2 3 4 5 List(const T* array, size_t size) :_pHead(new Node) { _pHead->_pNext = _pHead; _pHead->_pPre = _pHead; for (size_t i = 0; i < size; i++) { PushBack(array[i]); } } List(const List<T>& l) :_pHead(new Node) { _pHead->_pNext = _pHead; _pHead->_pPre = _pHead; Node* cur = l._pHead->_pNext; for (size_t i = 0; i < l.Size();i++) { PushBack(cur->_data); cur = cur->_pNext; } } List<T>& operator=(const List<T>& l) { if (this != &l) { Node* pRet = l._pHead->_pNext; for (size_t i = 0; i < l.Size(); i++) { PushBack(pRet->_data); pRet = pRet->_pNext; } } return *this; } ~List() { Clear(); delete _pHead; _pHead = NULL; } ///////////////////////////////////////////////////// Iterator Begin() { return Iterator(_pHead->_pNext); } Iterator End() { return Iterator(_pHead); } /////////////////////Modify////////////////////////// void PushBack(const T& data) { Node* _pNewNode = new Node(data); if (Empty())//链表为空 { _pHead->_pNext = _pNewNode; _pHead->_pPre = _pNewNode; _pNewNode->_pNext = _pHead; _pNewNode->_pPre = _pHead; } else { Node* pTail = _pHead->_pPre; pTail->_pNext = _pNewNode; _pNewNode->_pNext = _pHead; _pNewNode->_pPre = pTail; _pHead->_pPre = _pNewNode; } } void PopBack() { if (Empty())//链表为空 { return; } else { Node* del = _pHead->_pPre;//要删除的节点 Node* tail = del->_pPre;//新的尾节点 delete del; tail->_pNext = _pHead; _pHead->_pPre = tail; } } void PushFront(const T& data) { Node* _pNewNode = new Node(data); _pHead->_pNext->_pPre = _pNewNode; _pNewNode->_pNext = _pHead->_pNext; _pNewNode->_pPre = _pHead; _pHead->_pNext = _pNewNode; } void PopFront() { if (Empty()) { return; } else { Node* pDel = _pHead->_pNext; _pHead->_pNext = pDel->_pNext; pDel->_pNext->_pPre = _pHead; delete pDel; } } Iterator Insert(Iterator pos, const T& data) { Node* _pNewNode = new Node(data); pos._pCur->_pPre->_pNext = _pNewNode; _pNewNode->_pNext = pos._pCur; _pNewNode->_pPre = pos._pCur->_pPre; pos._pCur->_pPre = _pNewNode; return Iterator(_pNewNode); } Iterator Erase(Iterator pos) { Node* pCur = pos._pCur->_pNext; pos._pCur->_pNext->_pPre = pos._pCur->_pPre; pos._pCur->_pPre->_pNext = pos._pCur->_pNext; delete pos._pCur; return Iterator(pCur); } Iterator Find(const T& d) //通过迭代器来查找 { Iterator it = Begin(); while (it != End()) { if ((*it) == d) return it; it++; } return End(); } bool Empty()const { return _pHead->_pNext == _pHead; } size_t Size()const { Node* pCur = _pHead->_pNext; size_t count = 0; while (pCur != _pHead) { ++count; pCur = pCur->_pNext; } return count; } T& Front() { return _pHead->_pNext->_data; } const T& Front()const { return _pHead->_pNext->_data; } T& Back() { return _pHead->_pPre->_data; } const T& Back()const { return _pHead->_pPre->_data; } void Clear() { Iterator it = Begin(); while (it != End()) { it = Erase(it); } _pHead->_pNext = _pHead; _pHead->_pPre = _pHead; }private: ListNode<T>* _pHead;};void PrintList( List<int>& l){ List<int>::Iterator It = l.Begin(); while (It != l.End()) { cout << *It << " "; ++It; } cout << endl;}
测试代码
#define _CRT_SECURE_NO_WARNINGS 1#include "queue.h"void FunTest1(){ Queue1<int, List<int>> q1; for (int i = 0; i <= 5; i++) { q1.Push(i); } while (!q1.Empty()) { cout << q1.Front() << " "; q1.Pop(); } cout << endl;}void FunTest2(){ Queue2<int, List> q2; for (int i = 0; i <= 5; i++) { q2.Push(i); } while (!q2.Empty()) { cout << q2.Front() << " "; q2.Pop(); } cout << endl;}int main(){ FunTest1(); FunTest2(); system("pause"); return 0;}
读者可以自己进行跟踪调试查看结果
阅读全文
0 0
- 基于List实现适配器queue(链式队列)
- 基于List实现适配器Queue(链式队列)
- Queue队列 链式存储实现
- queue-c链式队列
- 链式队列(Linked Queue)
- 【STL】queue队列适配器
- 循环队列Queue–使用链式存储结构实现
- 链式结构的队列: Queue
- 基于双链表 实现Java Queue队列
- 链式Queue的实现
- 适配器queue---deque/List做空间配置器实现
- 队列(C语言实现,基于链式结构)
- Queue(3)Queue的链式实现
- 用List模拟实现STL下的queue队列
- 链式队列的实现
- 链式队列的实现
- 链式队列的实现
- 链式队列的实现。
- iptables入门:规则及路由基础
- 架构方面的电子书
- 【OpenCV入门教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
- java笔记5
- Windows 下maven nexus 3.X 部署,上传jar包
- 基于List实现适配器queue(链式队列)
- Android仿qq实现锁屏消息提醒
- Linux下getopt()函数的简单使用
- MySQL的简单认识
- java笔记6继承
- 【CSS】你不知道的auto
- WebP使用指南
- hihoCoder 第177周
- Python基础4(new版)