链表队列(LinkedListQueue)
栈操作

入队

template<typename T>
void LinkedListQueue<T>::enqueue(T e) {
if (tail == nullptr) //队列是否为空
{
tail = new QNode<T>(e); //为空则添加在对尾指针
head = tail; //头和尾指向同一个节点
}
else {
tail->next = new QNode<T>(e); //否则tail的next指向新节点
tail = tail->next; //tail向后移一位,也就是tail指向新节点
}
++size; //大小+1
}
出队

template<typename T>
T LinkedListQueue<T>::dequque() {
if (!isEmpty()) //判断队列是否为空
{
QNode<T>* retNode = head; //不为空,并把头节点的指向给临时节点
head = head->next; //头指向向后移一位,也就是head指向了第二个节点
retNode->next = nullptr; //把原本头节点的next指向置为空
if (head == nullptr) //如果向后移一位后指向空
{
tail = nullptr; //则说明队列原本就一个元素,出队删除一个后,队列为空,所以尾指针指原本指向要删除的节点现在也要指向空
}
--size; //大小-1
return retNode->e; //返回出队元素
}
}
代码清单
LinkedListQueue.h
#ifndef C___LINKEDLISTQUEUE_H
#define C___LINKEDLISTQUEUE_H
#include <iostream>
template<typename T>
class QNode {
public:
QNode() : e(0), next(nullptr) {} //无参构造
QNode(T& E) : e(E), next(nullptr) {} //传入一个元素
QNode(T& E, QNode<T>* Next) : e(E), next(Next) {} //传元素和下一节点
T e; //元素
QNode<T>* next; //指向下一节点
};
template<typename T>
class LinkedListQueue : public QNode<T>
{
public:
LinkedListQueue() :head(nullptr), tail(nullptr), size(0) {} //默认构造
int getSize()const; //返回队列大小
bool isEmpty()const; //判断是否为空
void enqueue(T e); //入队
T dequque(); //出队
T getFront(); //返回头
void print()const; //打印
private:
QNode<T>* head; //指向头
QNode<T>* tail; //指向尾
int size; //记录大小
};
template<typename T>
int LinkedListQueue<T>::getSize() const {
return size; //返回大小
}
template<typename T>
bool LinkedListQueue<T>::isEmpty() const {
return size == 0; //如果等0为空返回true
}
template<typename T>
void LinkedListQueue<T>::enqueue(T e) {
if (tail == nullptr) //队列是否为空
{
tail = new QNode<T>(e); //为空则添加在对尾指针
head = tail; //头和尾指向同一个节点
}
else {
tail->next = new QNode<T>(e); //否则tail的next指向新节点
tail = tail->next; //tail向后移一位,也就是tail指向新节点
}
++size; //大小+1
}
template<typename T>
T LinkedListQueue<T>::dequque() {
if (!isEmpty()) //判断队列是否为空
{
QNode<T>* retNode = head; //不为空,并把头节点的指向给临时节点
head = head->next; //头指向向后移一位,也就是head指向了第二个节点
retNode->next = nullptr; //把原本头节点的next指向置为空
if (head == nullptr) //如果向后移一位后指向空
{
tail = nullptr; //则说明队列原本就一个元素,出队删除一个后,队列为空,所以尾指针指原本指向要删除的节点现在也要指向空
}
--size; //大小-1
return retNode->e; //返回出队元素
}
}
template<typename T>
T LinkedListQueue<T>::getFront() {
if (!isEmpty()) //如果队列不为空
{
return head->e; //则返回头节点的元素
}
}
template<typename T>
void LinkedListQueue<T>::print()const {
QNode<T>* prev = head;
std::cout << "LinkListQueue: size = " << size << std::endl;
std::cout << "front ";
std::cout << "[";
while (prev != nullptr) {
std::cout << prev->e;
if (prev->next != nullptr) {
std::cout << ", ";
}
prev = prev->next;
}
std::cout << "] tail" << std::endl;
}
#endif //C___LINKEDLISTQUEUE_H
main.cpp
int main()
{
LinkedListQueue<int>*lq = new LinkedListQueue<int>();
for(int i = 0;i<10;++i)
{
if(i>=5)
{
lq->dequque();
lq->print();
} else{
lq->enqueue(i);
lq->print();
}
}
cout<<"getSize()"<<lq->getSize()<<endl;
cout<<"isEmpty()"<<lq->isEmpty()<<endl;
cout<<"getFront()"<<lq->getFront()<<endl;
return 0;
}
链表队列(LinkedListQueue)的更多相关文章
- java——链表、链表栈 LinkedListStack、链表队列 LinkedListQueue
LikedList: package Date_pacage; public class LinkedList<E> { public static void main(String[] ...
- 数据结构:C_链表队列的实现
数据结构链表形式队列的实现(C语言版) 1.写在前面 队列是一种和栈相反的,遵循先进先出原则的线性表. 本代码是严蔚敏教授的数据结构书上面的伪代码的C语言实现代码. 分解代码没有包含在内的代码如下: ...
- C语言 复杂队列(链表队列)
//复杂的队列二 --链表队列 #include<stdio.h> #include<stdlib.h> #define datatype int struct queueli ...
- java:数据结构复习(三)链表队列
@TOC 和栈一样,队列也是表,但是使用队列的特点是先进先出. 队列模型 队列的基本操作是入队,它是在表的末端插入一个元素,和出队,它是删除在表开头的一个元素 graph LR A[<kbd&g ...
- HDU 6215:Brute Force Sorting(链表+队列)
题目链接 题意 给出一个长度为n的数组,每次操作都要删除数组里面非递增的元素,问最终的数组元素有什么. 思路 容易想到用链表模拟删除,但是不能每次都暴力枚举,这样复杂度O(N^2).想到每次删除元素的 ...
- 5、链表队列(java实现)
1.图例 2.链表节点 public class Node<T> { public T data; public Node next; } 3.具体实现 public class Link ...
- Python列表操作与深浅拷贝(5)——数字处理函数、类型判断、列表链表队列栈
python内建数据结构 分类 数值型: int float complex bool 序列对象: 字符串str 列表list 元组tuple 键值对: 集合set 字典dict 数值型 (list ...
- java并发编程工具类JUC第四篇:LinkedBlockingQueue链表队列
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue. LinkedBlockingQueue 队列是Blo ...
- golang数据结构和算法之QueueLinkedList链表队列
队列和堆栈不一样的地方在于进出顺序: 堆栈是后进先出, 队列是先进先出. QueueLinkedList.go package QueueLinkedList type Node struct { d ...
- AcWing 851. spfa求最短路 边权可能为负数。 链表 队列
#include <cstring> #include <iostream> #include <algorithm> #include <queue> ...
随机推荐
- 【CVE-2024-21626】容器逃逸漏洞修复
哈喽大家好,我是咸鱼. 好久不见,最近有一个很火的 CVE--runc 容器逃逸漏洞.年前的时候我们已经在测试环境进行了相关操作打算年后线上进行修复. 因为今天咸鱼才开工,所以文章也就拖到了现在 漏洞 ...
- Python中 r'', b'', u'', f'' 的含义
python中 r'', b'', u'', f'' 的含义 r/R:非转义的原始字符串 与普通字符相比,其他相对特殊的字符,其中可能包含转义字符,即那些,反斜杠加上对应字母,表示对应的特殊含义的 ...
- win32-localtime的使用
下面的例子用于反映本地系统的日期格式变化 // locale test #include <stdio.h> #include <locale.h> #include < ...
- Docker实践之08-使用网络
目录 一.外部访问容器 启动容器时指定参数-P(大写P) 启动容器时指定参数-p(小写p) 二.容器互联 使用--link参数使容器互联 将容器加入自定义网络实现互联 三.为容器配置DNS 一.外部访 ...
- Hdf5开发笔记(一):hdf5介绍,在windows上编译msvc2015x64版本
前言 matlab的matio库需要使用到hdf5,编译hdf5的msvc2015x64版本. HDF5介绍 HDF(Hierarchical Data Format)是一种设计用于存储和组织 ...
- 老生常谈的iOS- weak原理,你真的懂得还是为了应付面试
前言 weak对于iOS开发来说只要解决一些对象相互引用的时候,避免出现强强引用,对象不能被释放,出现内存泄露的问题. weak 关键字的作用域弱引用,所引用对象的计数器不会加一,并在引用对象被释放的 ...
- 【Azure 事件中心】适用Mirror Maker生产数据发送到Azure Event Hub出现发送一段时间后Timeout Exception: Expiring 18 record(s) for xxxxxxx: 79823 ms has passed since last append
问题描述 根据"将 Apache Kafka MirrorMaker 与事件中心配合使用"一文,成功配置了Mirror Maker来发送数据到Event Hub中.为什么只能成功运 ...
- Nebula Graph 源码解读系列 | Vol.01 Nebula Graph Overview
上篇序言中我们讲述了源码解读系列的由来,在 Nebula Graph Overview 篇中我们将带你了解下 Nebula Graph 的架构以及代码仓分布.代码结构和模块规划. 1. 架构 Nebu ...
- C++socket服务器与客户端简单通信流程
服务器和客户端简单通信的流程,做一个简单的复习: 1.服务器创建的流程 代码如下,各个重要函数已经写注释: #include <iostream> // 推荐加上宏定义 #define W ...
- jquery判断滚动条是否到达顶部或者底部
<script> $(function(){ $(window).scroll(function(){ //离顶部的距离=0 //方法一:var isTop=$(this).scrollT ...