数据结构--队列Queue--链式队列、顺序队列

队列:先进先出,就如排队一样,先到的,先排上

1.链式队列

1.1 头文件 listQueue.h

/*** @description: 链式队列* @author: michael ming* @date: 2019/4/1 22:47* @modified by:*/#ifndef QUEUE_LISTQUEUE_H
#define QUEUE_LISTQUEUE_H
template <class T>
struct SNode
{T data;SNode* pNext;
};typedef unsigned int UINT;
template <class T>
class ListQueue
{
public:ListQueue(void);~ListQueue(void);bool enqueue(const T& data);  //入队    从队列的尾部插入数据bool dequeue();		//出队   从队列的头部弹出数据UINT getlength() const;	//获得队列的长度bool empty() const;		//判断队列是否为空void erase();		//清空队列void print() const;       //打印队列SNode<T>* getHead();    //获取队首SNode<T>* getTail();    //获取队尾
private:SNode<T>* m_pHead;SNode<T>* m_pTail;UINT m_QueueLen;
};#include "listQueue.cpp"
#endif //QUEUE_LISTQUEUE_H

1.2 类实现文件 listQueue.cpp

/*** @description: 链式队列实现文件* @author: michael ming* @date: 2019/4/1 22:47* @modified by:*/
//#include "listQueue.h"
#include <iostream>
using namespace std;
template <class T>
ListQueue<T>::ListQueue():m_pHead(NULL),m_pTail(NULL),m_QueueLen(0){}
template <class T>
ListQueue<T>::~ListQueue()
{erase();
}
template <class T>
inline void ListQueue<T>::erase()
{SNode<T>* temp;while(m_pHead != NULL){temp = m_pHead->pNext;delete m_pHead;m_pHead = temp;}m_pTail = NULL;m_QueueLen = 0;
}
template <class T>
bool ListQueue<T>::empty() const
{return m_pHead == NULL;
}
template <class T>
UINT ListQueue<T>::getlength() const
{return m_QueueLen;
}
template <class T>
bool ListQueue<T>::enqueue(const T &data)
{SNode<T>* newNode = new SNode<T>;newNode->data = data;newNode->pNext = NULL;if(m_pTail == NULL)m_pHead = m_pTail = newNode;else{m_pTail->pNext = newNode;m_pTail = newNode;}m_QueueLen++;return true;
}
template <class T>
bool ListQueue<T>::dequeue()
{if(m_pHead != NULL){SNode<T>* temp = m_pHead;m_pHead = m_pHead->pNext;if(m_pHead == NULL)m_pTail == NULL;delete temp;m_QueueLen--;return true;}return false;
}
template <class T>
void ListQueue<T>::print() const
{cout << "-------------------------------------------" << endl;cout << "List Queue from head to tail as follow: " << endl;SNode<T>* temp = m_pHead;   int i = 0;while(temp != NULL){cout << "No." << ++i << " elem is " << temp->data << endl;temp = temp->pNext;}
}
template <class T>
SNode<T>* ListQueue<T>::getHead()
{return m_pHead;
}
template <class T>
SNode<T>* ListQueue<T>::getTail()
{return m_pTail;
}

1.3 测试主函数 listqueue_main.cpp

/*** @description:* @author: michael ming* @date: 2019/4/1 22:49* @modified by:*/
#include "listQueue.h"
#include <iostream>
int main()
{ListQueue<int> intqueue;int k = 5;for(int i = 0; i < k; ++i){intqueue.enqueue(i);}intqueue.print();std::cout << "len of queue is " << intqueue.getlength() << std::endl;for(int i = 0; i < k-1; ++i){intqueue.dequeue();std::cout << "after one dequeue: " << std::endl;intqueue.print();}std::cout << "len of queue is " << intqueue.getlength() << std::endl;std::cout << "head is " << intqueue.getHead()->data << std::endl;std::cout << "tail is " << intqueue.getTail()->data << std::endl;return 0;
}

1.4 valgrind测试运行结果

在这里插入图片描述

2. 顺序队列

基于数组实现,有容量限制

2.1 头文件 arrqueue.h

/*** @description: 顺序队列,内部基于数组* @author: michael ming* @date: 2019/4/2 21:24* @modified by:*/
#ifndef QUEUE_ARRQUEUE_H
#define QUEUE_ARRQUEUE_H
typedef unsigned int UINT;
template <class T>
class arrQueue
{
public:arrQueue(const int capa = 10);~arrQueue(void);bool enqueue(const T& data);  //入队    从队列的尾部插入数据bool dequeue();		//出队   从队列的头部弹出数据UINT getlength() const;	//获得队列的长度bool empty() const;		//判断队列是否为空bool full() const;      //判断队列是否满void erase();		//清空队列void print() const;       //打印队列const T& getHead() const;    //获取队首const T& getTail() const;    //获取队尾
private:int m_pHead;int m_pTail;UINT m_QueueLen;UINT m_capacity;T* arrQ;
};#include "arrqueue.cpp"
#endif //QUEUE_ARRQUEUE_H

2.2 类实现文件 arrqueue.cpp

/*** @description: 顺序队列实现文件* @author: michael ming* @date: 2019/4/2 21:26* @modified by:*/
#include <iostream>
using namespace std;
template <class T>
arrQueue<T>::arrQueue(const int capa):m_pHead(0),m_pTail(-1),m_QueueLen(0),m_capacity(capa)
{arrQ = new T[m_capacity];
}
template <class T>
arrQueue<T>::~arrQueue()
{erase();delete [] arrQ;
}
template <class T>
inline void arrQueue<T>::erase()
{m_QueueLen = 0;m_pHead = 0;m_pTail = -1;
}
template <class T>
bool arrQueue<T>::empty() const
{return m_QueueLen == 0;
}
template <class T>
bool arrQueue<T>::full() const
{return m_QueueLen == m_capacity;
}
template <class T>
bool arrQueue<T>::enqueue(const T &data)
{if(full())return false;else{if(empty()){m_pHead = m_pTail = 0;arrQ[0] = data;m_QueueLen++;}else if(m_pTail < m_capacity-1){arrQ[++m_pTail] = data;m_QueueLen++;}else    //队列没满,但是队尾到达数组末尾了,数据整体移至数组头部{for(UINT i = 0; i < m_QueueLen; ++i){arrQ[i] = arrQ[m_pHead++];}m_pHead = 0;arrQ[m_QueueLen++] = data;m_pTail = m_QueueLen - 1;}return true;}
}
template <class T>
bool arrQueue<T>::dequeue()
{if(empty())return false;else{m_pHead++;m_QueueLen--;if(m_QueueLen == 0){m_pHead = 0;m_pTail = -1;}return true;}
}
template <class T>
UINT arrQueue<T>::getlength() const
{return m_QueueLen;
}
template <class T>
const T& arrQueue<T>::getHead() const
{return arrQ[m_pHead];
}
template <class T>
const T& arrQueue<T>::getTail() const
{return arrQ[m_pTail];
}
template <class T>
void arrQueue<T>::print() const
{if(empty())cout << "empty queue!" << endl;cout << "arrQueue from head to tail as follow:" << endl;int j = m_pHead;for(UINT i = 0; i < m_QueueLen; ){cout << "No." << ++i << " elem is " << arrQ[j++] << endl;}cout << "--------------print end----------------" << endl;
}

2.3 测试主程序 arrqueue_main.cpp

/*** @description:* @author: mingm* @date: 2019/4/1 22:44* @param:* @return:*/
#include <iostream>
#include "arrqueue.h"
int main()
{arrQueue<int> intqueue(7);for(UINT i = 0; i < 8; ++i){intqueue.enqueue(i);intqueue.print();}for(UINT i = 0; i < 5; ++i){intqueue.dequeue();intqueue.print();}intqueue.enqueue(100);intqueue.print();cout << "the length of queue is " << intqueue.getlength() << endl;cout << "head is " << intqueue.getHead() << ", tail is " << intqueue.getTail() << endl;return 0;
}

2.4 valgrind测试结果正确

部分结果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术动态 | 人工智能开源软件发展现状连载——知识图谱开源软件

本文转载自公众号&#xff1a;中国人工智能开源软件发展联盟&#xff0c;欢迎大家点击文末二维码关注。知识图谱 (Knowledge Graph)是一种基于图的数据结构&#xff0c;由节点(Point)和边(Edge)组成。在知识图谱里&#xff0c;每个节点表示现实世界中存在的“实体”&#xff0c…

2018 支付宝Java开发四面:Ngnix+MQ队列+集群+并发抢购

一面 介绍项目 java 线程池的实现原理&#xff0c;threadpoolexecutor关键参数解释 hashmap的原理&#xff0c;容量为什么是2的幂次 为什么要同时重写hashcode和equals ConcurrentHashMap如何实现线程安全&#xff1f; 介绍Java多线程的5大状态&#xff0c;以及状态图流转…

ACL2020 | 线上搜索结果大幅提升!亚马逊提出对抗式query-doc相关性模型

一只小狐狸带你解锁 炼丹术&NLP 秘籍作者&#xff1a;机智的叉烧&#xff08;OPPO算法工程师&#xff0c;擅长Query理解方向&#xff09;背景搜索和推荐经常会被放在一起对比&#xff0c;其中最突出的区别就是搜索中存在query&#xff0c;需要充分考虑召回内容和query之间的…

微型计算机性能指标以及分类

衡量微型计算机的主要技术指标是&#xff1f;特点是&#xff1f; 2018-11-29 20:38:08 来源&#xff1a;贤集网 赵媛 微型计算机大家应该耳熟能详&#xff0c;它又比称为“微型机”&#xff0c;由于其具备人脑的某些功能&#xff0c;所以也称其为“微电脑”。现在流行的微…

领域应用 | 为电商而生的知识图谱,如何感应用户需求?

本文转载自公众号&#xff1a;阿里技术(ali_tech)。 阿里妹导读&#xff1a;本文从需求分析和体系化构建的角度出发&#xff0c;阐述在电商这一特殊领域的知识图谱构建过程中&#xff0c;形成的一整套概念体系&#xff0c;还有在此过程中&#xff0c;通过算法、工程、产品、…

史上最全阿里Java面试题目大汇总!强烈建议收藏~

阿里面试题目目录 技术一面&#xff08;基础面试题目&#xff09; 技术二面&#xff08;技术深度、技术原理&#xff09; 项目实战&#xff08;项目模拟面试&#xff09; JAVA开发技术常问的问题 阿里必会知识 阿里面试范畴 阿里面试总结 一&#xff1a;阿里技术一面&…

数据结构与算---重点复习知识

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/sakurakider/article/details/82924371 </div><link rel"stylesheet" href"https://csdnimg.cn/release/phoeni…

GPT-3诞生,Finetune也不再必要了,NLP领域又一核弹

本文转载自公众号“夕小瑶的卖萌屋”&#xff0c;专业带逛互联网算法圈的神操作 -----》我是传送门 关注后&#xff0c;回复以下口令&#xff1a; 回复【789】 &#xff1a;领取深度学习全栈手册&#xff08;含NLP、CV海量综述、必刷论文解读&#xff09; 回复【入群】&…

POJ 1363 火车厢排队问题(栈)

题目链接&#xff1a;http://poj.org/problem?id1363 题目大意&#xff1a; A站有编号为1到N&#xff0c;N最大1000&#xff0c;的车厢&#xff0c;车厢进入中转station了就不能回到A&#xff0c;只能停在station内或者进入B站&#xff0c;问能不能按照给定的顺序排成那样的车…

徐阿衡 | 知识抽取-实体及关系抽取(一)

本文转载自公众号&#xff1a;徐阿衡。 这一篇是关于知识抽取&#xff0c;整理并补充了上学时的两篇笔记 NLP笔记 - Information Extraction 和 NLP笔记 - Relation Extraction&#xff0c;梳理了知识抽取的基本方法&#xff0c;包括传统机器学习及经典的深度学习方法。知识抽取…

非常全面的阿里的Java面试题目,涵盖Java基础+高级+架构

阿里技术一面 自我介绍 Java中多态是怎么实现的 Java中的几种锁 数据库隔离级别 脏读 幻读 ACID mysql的隔离级别 mysql索引实现&#xff0c;如何解决慢查询 数据库锁是怎么实现的 死锁的条件&#xff0c;进程和线程区别 tcp/ip模型&#xff0c;tcp和udp区别 Linux查看…

常见数据结构与算法整理总结(上)

原文链接&#xff1a;https://www.jianshu.com/p/230e6fde9c75 常见数据结构与算法整理总结&#xff08;上&#xff09; 最后编辑于 2017.12.04 03:29">2016.09.22 10:51*</span>数据结构是以某种形式将数据组织在一起的集合&#xff0c;它不仅存储数据&#xff…

卖萌屋原创专辑首发,算法镇魂三部曲!

一只小狐狸带你解锁炼丹术&NLP秘籍震惊&#xff01;乐坛新人夕小瑶的卖萌屋今日重磅发布三张原创专辑&#xff01;&#xff01;????点击试听????点击试听????点击试听虽然卖萌屋常常被大家戏称为“仙女屋”、“神仙屋”、“宝藏屋”等&#xff0c;但卖萌屋更希…

POJ 1028 浏览器前进后退(双栈)

题目链接&#xff1a;http://poj.org/problem?id1028 我的相同博文参考&#xff1a;https://blog.csdn.net/qq_21201267/article/details/88938360 LeetCode 5430. 设计浏览器历史记录&#xff08;双栈&#xff09; 解题思路参考上面博文。直接贴出代码&#xff1a; #inclu…

自然语言处理中的中文词性、标记规范及其应用

分词和词性标注是自然语言处理领域的重要组成部分&#xff0c;尤其对于中文而言&#xff0c;作为整条自然语言处理pipeline的源头&#xff0c;分词和词性标注更是起到了关键的作用。我整理这篇文章&#xff0c;主要来源于这几个问题&#xff1a; 一、理解中文词性是否有意义&am…

白雪 | NLP加持知识图谱在金融事件挖掘中的应用

本文转载自公众号&#xff1a;阡寻科技。9月15日讯&#xff0c;涵盖金融科技、人工智能及区块链领域的2018恒生技术开放日于今日开幕&#xff0c;阡寻科技联席CEO、复旦大学人工智能方向博士白雪受邀出席本次大会&#xff0c;分享了金融领域事件特点分析、常用的事件抽取方法以…

2020年,中国AI创业公司将走向何方

前言如果说2012年深度学习的崛起是点燃AI浪潮的星星之火&#xff0c;那么2016年的AlphaGo的成功则是一阵东风&#xff0c;AI之火已成燎原之势。那么&#xff0c;走向21世纪的新的十年&#xff08;2020年&#xff09;&#xff0c;中国AI创业公司将走向何方呢&#xff1f;作者是一…

常见数据结构与算法整理总结(下)

原文链接&#xff1a;https://www.jianshu.com/p/42f81846c0fb 这篇文章是常见数据结构与算法整理总结的下篇&#xff0c;上一篇主要是对常见的数据结构进行集中总结&#xff0c;这篇主要是总结一些常见的算法相关内容&#xff0c;文章中如有错误&#xff0c;欢迎指出。 一、概…

2019蚂蚁金服 Java面试题目!涵盖现场3面真题

蚂蚁Java一面 二叉搜索树和平衡二叉树有什么关系&#xff0c;强平衡二叉树&#xff08;AVL树&#xff09;和弱平衡二叉树&#xff08;红黑树&#xff09;有什么区别 B树和B树的区别&#xff0c;为什么MySQL要使用B树 HashMap如何解决Hash冲突 epoll和poll的区别&#xff0c;…

数据结构--队列Queue--打印杨辉三角

杨辉三角大家很熟悉&#xff0c;不做介绍了&#xff0c;第n行的首末两元素均为1&#xff0c;中间n-2个元素由n-1行相邻两元素相加得到。 将第1行数据入队&#xff08;1&#xff09; -------队列表示&#xff08;队头&#xff0c;… 队尾&#xff09;------- 第2行数据1入队&am…