练习 -- 使用双向链表来实现双向队列
来源:互联网 发布:淘宝卖什么 货源 编辑:程序博客网 时间:2024/05/22 11:01
1.题目:
使用一个双向链表来实现一个双向的队列,并且让队列具有以下的操作:
(1)判断队列是否为空
(2)得到双向队列中元素的个数
(3)向左端添加一个新元素
(4)向右端添加一个新元素
(5)从左端删除一个元素
(6)从右端删除一个元素
2.分析:
有了双向链表,我们就可以创建我们自己的双向队列,并且很容易地就能实现上面的操作
3.代码:
doublelist.hpp
#ifndef DOUBLELIST_HPP#define DOUBLELIST_HPPtemplate<typename T>class DoubleList{public:DoubleList();~DoubleList();void insertAtHead(T item); //在表头插入节点void insertAtTail(T item);//在表尾插入节点T deleteAtHead();//在表头删除节点T deleteAtTail();//在表尾删除节点bool isEmpty();//判空int size();//得到元素的个数private:class Node //内部节点类{public:Node(T item) : next(nullptr), pre(nullptr), data(item){}~Node(){}T data;Node* next;Node* pre;};Node* first;Node* tail;int sizeOfList;};template<typename T>DoubleList<T>::DoubleList() : first(nullptr), tail(nullptr), sizeOfList(0) {}template<typename T>DoubleList<T>::~DoubleList() {if (isEmpty()){}else{while (first != nullptr){Node* deleteNode = first;first = first->next;deleteNode->next = nullptr;delete deleteNode;}}}template<typename T>void DoubleList<T>::insertAtHead(T item){if (isEmpty()) //如果表为空{Node* currentNode = new Node(item);first = tail = currentNode;}else{Node* currentNode = new Node(item);currentNode->next = first;first->pre = currentNode;first = currentNode;}sizeOfList++;}template<typename T>void DoubleList<T>::insertAtTail(T item){if (isEmpty()) // 如果表为空{Node* currentNode = new Node(item);first = tail = currentNode;}else{Node* currentNode = new Node(item);currentNode->pre = tail;tail->next = currentNode;tail = currentNode;}sizeOfList++;}template<typename T>T DoubleList<T>::deleteAtHead(){if (isEmpty()) // 如果表为空{return nullptr;}else{T returnData = first->data;Node* deleteNode = first;first = first->next;deleteNode->next = nullptr;delete deleteNode;sizeOfList--;return returnData;}return nullptr;}//模版特化template<>int DoubleList<int>::deleteAtHead(){if (isEmpty()) // 如果表为空{return 0;}else{int returnData = first->data;Node* deleteNode = first;first = first->next;deleteNode->next = nullptr;delete deleteNode;sizeOfList--;return returnData;}return 0;}template<typename T>T DoubleList<T>::deleteAtTail(){if (isEmpty()) // 如果表为空{return nullptr;}else{int returnData = tail->data;Node* deleteNode = tail;tail = tail->pre;deleteNode->pre = nullptr;delete deleteNode;sizeOfList--;return returnData;}return nullptr;}//模版特化template<>int DoubleList<int>::deleteAtTail(){if (isEmpty()) // 如果表为空{return 0;}else{int returnData = tail->data;Node* deleteNode = tail;tail = tail->pre;deleteNode->pre = nullptr;delete deleteNode;sizeOfList--;return returnData;}return 0;}template<typename T>bool DoubleList<T>::isEmpty(){return sizeOfList == 0;}template<typename T>int DoubleList<T>::size(){return sizeOfList;}#endif
deque.hpp
#ifndef DEQUE_HPP#define DEQUE_HPP#include "doublelist.hpp"template<typename T>class Deque{public:Deque();//创建空的双向队列~Deque();void pushLeft(T item); //向左端添加一个新元素void pushRight(T item); //向右端添加一个新元素T popLeft(); //从左端删除一个元素T popRight(); //从右端删除一个元素int size(); //双向队列中的元素数量bool isEmpty(); //双向队列是否为空private:DoubleList<T> myList;};template<typename T>Deque<T>::Deque() : myList(){}template<typename T>Deque<T>::~Deque(){}template<typename T>int Deque<T>::size(){return myList.size();}template<typename T>void Deque<T>::pushLeft(T item){myList.insertAtHead(item);}template<typename T>void Deque<T>::pushRight(T item){myList.insertAtTail(item);}template<typename T>T Deque<T>::popLeft(){return myList.deleteAtHead();}template<typename T>T Deque<T>::popRight(){return myList.deleteAtTail();}template<typename T>bool Deque<T>::isEmpty(){return myList.isEmpty();}#endif
main.cpp
#include <iostream>#include <string>#include "deque.hpp"using namespace std;int main(int agrc, char** argv){Deque<int> deque;for(int i = 0; i != 5; ++i){deque.pushLeft(i);}for (int i = 5; i != 0; --i){deque.pushRight(i);}int size = deque.size();for (int i = 0; i != size; ++i){//cout << deque.popLeft() << " ";cout << deque.popRight() << " ";}cout << endl;return 0;}
4.总结:双向队列还能使用动态数组来实现,但是使用数组的话,在左端插入元素的操作所需的时间跟集合大小相关,会花费多余的时间,所以我们还是使用双向链表来实现双向队列。
0 0
- 练习 -- 使用双向链表来实现双向队列
- 使用php实现双向队列
- 用链表实现双向队列
- 用单链表实现双向队列
- php实现双向队列
- php实现双向队列
- PHP实现双向队列
- 双向队列的使用
- 练习--实现双向链表
- 实现Lua的双向队列
- 双向链表实现队列
- PHP简单双向队列实现
- Lua 双向队列的实现
- 双向队列
- 双向队列
- 双向队列
- 双向队列
- 双向队列
- Andorid开发工具类之——SPUtils(加入泛型,更智能)
- mysql索引排序
- 15.组合模式
- Quartz 2.2.1学习笔记 (二) Jobs、JobDetail、JobDataMap
- Android PopupWindow窗口
- 练习 -- 使用双向链表来实现双向队列
- u8glib自学笔记2
- 欢迎使用CSDN-markdown编辑器
- Android属性动画--Property Animation(一)
- webpack全接触
- C++连接mysql数据库的两种方法(ADO连接和mysql api连接)
- HTML总结
- CentOS 使用中文输入法
- 回调函数通俗