链式队列是基于单链表的一种存储表示, 其形状如下图所示:

(队列的队头指针指向单链表的第一个结点, 队尾指针指向单链表的最后一个结点, 注意没有无用的空[头/尾]节点)

用单链表表示的链式队列特别适合于数据元素变动比较大的情况, 而且不存在队列满而产生溢出的情况;

链式队列结点构造:

[这次我们将节点构造成了类LinkQueue的嵌套类]

struct ChainNode
{ChainNode(const Type &_data, ChainNode *_next = NULL):data(_data), next(_next) {}Type data;ChainNode *next;
};

链式队列构造:

template <typename Type>
class LinkQueue
{template <typename T>friend ostream &operator<<(ostream &os, LinkQueue<T> &queue);
public:LinkQueue();~LinkQueue();bool isEmpty() const;void push(const Type &data);void pop();//返回队首元素const Type &front() const;//返回队尾元素const Type &back() const;//清空队列void makeEmpty();private:struct ChainNode{ChainNode(const Type &_data, ChainNode *_next = NULL):data(_data), next(_next) {}Type data;ChainNode *next;};private:ChainNode *m_front; //队首指针[注意不是指向一个无用的空节点]ChainNode *m_back;  //队尾指针[注意不是指向一个无用的空节点]
};

队列的构造与析构:

template <typename Type>
LinkQueue<Type>::LinkQueue()
{m_front = m_back = NULL;
}
template <typename Type>
LinkQueue<Type>::~LinkQueue()
{makeEmpty();
}

队列的四大操作:

//入队, 这是链式队列的关键
template <typename Type>
void LinkQueue<Type>::push(const Type &data)
{if (isEmpty()){//如果队列为空//则队首与队尾指针共同指向一个新构造的对象m_front = m_back = new ChainNode(data);}else{//首先让队尾的下一位置指向一个新构造的对象m_back->next = new ChainNode(data);//然后队尾指针后移m_back = m_back->next;}
}
//出队
template <typename Type>
void LinkQueue<Type>::pop()
{if (isEmpty())throw std::range_error("queue is empty");ChainNode *deleteNode = m_front;// 队首指针后移m_front = m_front->next;delete deleteNode;
}
//取队首元素
template <typename Type>
const Type &LinkQueue<Type>::front() const
{if (isEmpty())throw std::range_error("queue is empty");return (m_front->data);
}
//取队尾元素
template <typename Type>
const Type &LinkQueue<Type>::back() const
{if (isEmpty())throw std::range_error("queue is empty");return (m_back->data);
}

清空队列与判空操作:

template <typename Type>
void LinkQueue<Type>::makeEmpty()
{while (!isEmpty()){pop();}
}
template <typename Type>
bool LinkQueue<Type>::isEmpty() const
{return (m_front == NULL);
}

输出队列所有元素(以做测试):

template <typename Type>
ostream &operator<<(ostream &os, LinkQueue<Type> &queue)
{for (typename LinkQueue<Type>::ChainNode *currentNode = queue.m_front;currentNode != NULL;currentNode = currentNode->next){os << currentNode->data << ' ';}return os;
}

附-测试代码:

int main()
{LinkQueue<int> queue;for (int i = 0; i < 10; ++i){queue.push(rand()%100);}cout << queue << endl;cout << queue.front() << endl;queue.pop();cout << queue.front() << endl;cout << queue.back() << endl;cout << queue << endl;LinkQueue<char> cQueue;cQueue.push('A');cout << "cQueue.front = " << cQueue.front() << endl;cout << "cQueue.back = " << cQueue.back() << endl;cQueue.pop();cout << cQueue << endl;try{cout << "cQueue.front = " << cQueue.front() << endl;cout << "cQueue.back = " << cQueue.back() << endl;}catch(const std::exception &e){cerr << e.what() << endl;}return 0;
}

数据结构基础(14) --链式队列的设计与实现相关推荐

  1. 数据结构——链式队列解析(C语言版)

    摘自:数据结构学习--链式队列解析(C语言版) 作者:正弦定理 发布时间:2020-11-26 21:07:08 网址:https://blog.csdn.net/chinesekobe/articl ...

  2. 数据结构上机实践第七周项目2 - 自建算法库——链队(链式队列)

    自建算法库--链队(链式队列) 实现源代码如下: 1.liqueue.h /* copyright (t) 2016,烟台大学计算机学院 *All rights reserved. *文件工程名称:1 ...

  3. 链式存储结构 php,【PHP 实现数据结构】链式队列

    什么是链式队列 队列是一种"先进先出"的存储结构,是一种特殊的线性表,于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作. 通常队列可以分为顺序队 ...

  4. 【数据结构】链式队列的实现(C语言)

    队列的链式存储称为链式队列.链式队列就是一个特殊的单链表,对于这种特殊的单链表,它的插入和删除操作规定在单链表的不同端进行.链式队列的队首和队尾指针分别用front和rear表示. 链式队列要掌握以下 ...

  5. 数据结构 - 队列简介 及 1个简单的c语言链式队列代码实现

    1. 队列的定义 所谓队列(queue)就是一种能实现"先进先出"的一种线性存储结构. 跟栈有点类似,  例如栈只有1个出入口, 任何元素进入或者离开栈都必须经过同1个出入口(栈顶 ...

  6. c语言定义链式队列用菜单,数据结构之---C语言实现链式队列

    //链式队列的存储 //杨鑫 #include #include typedef int QElemType; //定义节点 typedef struct QNode { QElemType data ...

  7. 数据结构之顺序队列和链式队列常用的一些操作

    顺序队列是队列的顺序存储结构,顺序队列实际上是运算受限的顺序表.和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素.由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示 ...

  8. (c语言数据结构)用链式队列的方式实现输入12345,输出12345操作——期末数据结构程序设计

    用链式队列的方式实现输入12345,输出12345操作 文章目录 用链式队列的方式实现输入12345,输出12345操作 1.队列的定义 2.队列的初始化 3.判空操作 4.入队操作 5.出队操作 6 ...

  9. 链式队列,队列篇(链式队列的出队入队操作)

    数据结构,队列篇(链式队列) 前言: 上一篇博主简单讲解了顺序队列和循环队列,今天讲解队列最后一篇链式队,链式队在数据结构中用到比较多,用来做一些排队的算法,还有链式队列是也是和链式栈一样采用链表的方 ...

最新文章

  1. 40年产权的商业地产,个人投资者决不能碰
  2. AutoHotkey 使用笔记
  3. 常见拒绝服务型攻击原理及行为特征
  4. boost::hana::find用法的测试程序
  5. python求阶乘和
  6. android两个耳机能连两部手机吗,AirPods使用技巧:如何让耳机同时连接两台手机...
  7. 微软 Excel 365 里如何设置下拉菜单和自动高亮成指定颜色
  8. Android插件基础之类加载器学习
  9. 时序数据合并场景加速分析和实现 - 复合索引,窗口分组查询加速,变态递归加速...
  10. php 邮件发送是html 没样式_使用python发送邮件
  11. Java基础巩固——排序
  12. ubuntu实用工具
  13. SteamVR 错误代码 108 / 203 / 208 / 301 / 306 / 308 / 400 / 405 排解方法
  14. 电信光猫 中兴ZXHN F412破解
  15. HTML5定稿,为什么是原生App的颠覆
  16. 5G赋能新文旅 巡天遥看一千河
  17. python绘制直方图显示数字_Python | 数据可视化汇总
  18. 扫地机器人漫谈(三):扫地机的传感器
  19. 关于Verilog中readmemb系统函数
  20. php 根据父级id查出,php,_三级分类 like查询 查询到很多id 需要找到对应的父级id 并根据父级id组合 应该怎么根据父级id将数据组合在一起呢?,php - phpStudy...

热门文章

  1. 数据结构之排序算法:基础概念
  2. (王道408考研数据结构)第二章线性表-第三节2:双链表的定义及其操作(插入和删除)
  3. [Python]网络爬虫(11):亮剑!爬虫框架小抓抓Scrapy闪亮登场!
  4. nc个人实战使用总结
  5. python twisted教程 二:缓慢的诗
  6. history 历史命令记录功能如何防坏人(高级)
  7. C/C++面试题—实现MyString类
  8. 灯塔,大海,大风。(一)
  9. 设计模式-结构型模式-装饰模式
  10. JavaScript数组sort()方法小结