数据结构——线性结构(7)——链队列的实现
来源:互联网 发布:电子日记本软件 编辑:程序博客网 时间:2024/06/06 17:10
链队列的实现
头文件:
/* *这部分文件实现我们之前所使用的queue类 *它主要的原理为 后进后出(LILO) */ #ifndef _Queue_h #define _Queue_h /* *类型: Queue<ValueType> *此类建立一个称为队列的线性结构,其中仅从一端添加和删除值。 *这个规定产生了一个(LILO)的行为,它是队列的定义特征。 *基本操作是enqueue(添加元素到尾部)和dequeue(把元素从头部删除)。 */ template <typename ValueType> class Queue{ public: /* *构造函数:Queue *用法:Queue <ValueType> queue *----------------------------- *初始化一个空队列 */ Queue(); //析构函数 ~Queue(); /* *方法:size() *用法:int n = queue.size(); *-------------------------- *返回队列中元素的个数 */ int size(); /* *方法:isEmpty() *用法:queue.isEmpty(); *-------------------------- *判断队列中元素是否为空 */ bool isEmpty(); /* *方法:clear() *用法:queue.clear(); *-------------------------- *清空队列中的所有元素 */ void clear(); /* *方法:enqueue() *用法:queue.enqueue(); *-------------------------- *向队尾插入一个元素 */ void enqueue(ValueType elem); /* *方法:pop() *用法:queue.dequeue(); *-------------------------- *移除队头的一个元素,并返回其值,如果队空 则返回一个错误 */ ValueType dequeue(); /* *方法:peek() *用法:queue.peek(); *-------------------------- *返回队头的值,但是不移除,peek 偷看的意思,如果队空 则返回一个错误 */ ValueType peek(); #include "queuepriv.h" //私有成员部分 }; #include "queueimpl.cpp" //将实现文件包含进来 #endif
隐藏头文件:queuepriv.h
/* *这个文件保存的是Queue.h的私有部分 *我们这个时候用顺序队列。也就是用数组来实现我们的队列 *这样的队列我们称为顺序队列 */private: /*队列的链式结构*/ struct Cell{ ValueType data; Cell *link; }; /*实例化变量*/ Cell *head; //头指针 Cell *tail; //尾指针 int count; //记录队列元素的总数 /* Make it illegal to copy queues */ Queue(const Queue & value) { } const Queue & operator=(const Queue & rhs) { return *this; }
实现文件:queueimpl.cpp
#ifdef _Queue_h#include "error.h"/*构造函数,创建一个空队列*/template<typename ValueType>Queue<ValueType>::Queue(){ head = tail = NULL; //队空的条件 count = 0;}/*析构函数*/template<typename ValueType>Queue<ValueType>::~Queue(){ clear();}/*返回队列的长度*/template<typename ValueType>int Queue<ValueType>::size(){ return count;}/*判断队列是否为空*/template<typename ValueType>bool Queue<ValueType>::isEmpty(){ return count == 0;}/*清空队列操作*/template<typename ValueType>void Queue<ValueType>::clear(){ while (count > 0) { dequeue(); }}/*入队列操作 *分为两步:1. 新建节点,并赋值 2. 添加到队列中,考虑队列此时是否为空 */template<typename ValueType>void Queue<ValueType>::enqueue(ValueType elem){ Cell *cell = new Cell; cell -> data = elem; //赋值 cell -> link = NULL; //因为添加的是队尾,所以指向下一位的指针为空指针 /*考虑,如果此刻的队列为空队列,那么我们新建的节点理所应当成为我们的队列的头指针*/ if (head == NULL) { head = cell; }else{ tail -> link = cell; } tail = cell; //将为指针的指向转向新建的尾节点 count++;}/*出队列操作 *分为三步:1.检测队列是否为空 2.建立临时指针指向要出队的节点 3.头指针指向后移,并删除临时指针*/template<typename ValueType>ValueType Queue<ValueType>::dequeue(){ /*执行操作之前检测队列是否为空*/ if (isEmpty()) { error("dequeue: Attempting to dequeue an empty queue"); } /*出队操作*/ Cell *cell = head; //建立一个临时指针指向我们的头节点 ValueType result = cell -> data;//记录当前的数据信息 head = cell -> link;//头指针指向后移 if(head == NULL) tail = NULL;//当队列的头指针为空时,表明此刻的队列为空 count--; delete cell;//删除临时节点 return result;}/*返回队头的值*/template<typename ValueType>ValueType Queue<ValueType>::peek(){ if (isEmpty()) { error("Attempting to peek at an empty queue"); } return head -> data;}
测试文件:
#include <iostream>#include "Queue.h"using namespace std;int main(){ Queue<int> myqueue; for (int i = 0; i < 10; i++) { myqueue.enqueue(i); } cout << "队伍的长度为: " << myqueue.size(); cout << endl; cout << "队头为: " << myqueue.peek() << endl; myqueue.enqueue(10); cout << "将10加入队列后,长度为:" <<myqueue.size() << endl; myqueue.dequeue(); cout << "执行出队操作后的队头为:" << myqueue.peek() << endl; return 0;}
测试结果:
阅读全文
1 0
- 数据结构——线性结构(7)——链队列的实现
- 数据结构——线性结构(5)——顺序队列的实现
- [数据结构]线性结构——队列
- [数据结构]线性结构——队列
- 数据结构——线性结构(6)——链队列的原理
- 数据结构——线性结构(4)——顺序队列与循环队列的原理
- 数据结构—线性结构—线性及其实现
- 数据结构——线性结构(3)——链栈的实现
- 线性结构——队列
- 数据结构——队列的链式存储结构以及实现
- [数据结构]线性结构——线性表
- 数据结构——线性结构
- 小白学数据结构——一、线性结构(栈和队列)
- 数据结构——线性结构(1)——顺序栈的实现
- 数据结构——线性结构(9)——Vector的实现过程详解
- 大话数据结构(二)——线性表链式存储结构(单链表)的java实现
- 大话数据结构(一)——线性表顺序存储结构的java实现
- 数据结构——第二讲、线性结构(7)
- odoo自定义报表
- AliOS Things云端物联网操作系统
- FeignClient相关
- 异常捕获机制
- laypage.js分页插件使用总结
- 数据结构——线性结构(7)——链队列的实现
- Escape HDU
- VSCode tasks.json中的各种替换变量的意思 ${workspaceFolder} ${file} ${fileBasename} ${fileDirname}等
- VSCode launch.json中的各种替换变量的意思 ${workspaceFolder} ${file} ${fileBasename} ${fileDirname}等
- 第七周——项目三 “负数把整数赶出队列”
- 带你看看获得鲁班奖的数据中心工程建设的有多完美!!
- Cisco UCS 自述:我不仅仅是服务器, 更是一个完整的系统
- 布线光纤方面的知识都在这了,千万别错过!
- lose fat