栈操作

入队

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)的更多相关文章

  1. java——链表、链表栈 LinkedListStack、链表队列 LinkedListQueue

    LikedList: package Date_pacage; public class LinkedList<E> { public static void main(String[] ...

  2. 数据结构:C_链表队列的实现

    数据结构链表形式队列的实现(C语言版) 1.写在前面 队列是一种和栈相反的,遵循先进先出原则的线性表. 本代码是严蔚敏教授的数据结构书上面的伪代码的C语言实现代码. 分解代码没有包含在内的代码如下: ...

  3. C语言 复杂队列(链表队列)

    //复杂的队列二 --链表队列 #include<stdio.h> #include<stdlib.h> #define datatype int struct queueli ...

  4. java:数据结构复习(三)链表队列

    @TOC 和栈一样,队列也是表,但是使用队列的特点是先进先出. 队列模型 队列的基本操作是入队,它是在表的末端插入一个元素,和出队,它是删除在表开头的一个元素 graph LR A[<kbd&g ...

  5. HDU 6215:Brute Force Sorting(链表+队列)

    题目链接 题意 给出一个长度为n的数组,每次操作都要删除数组里面非递增的元素,问最终的数组元素有什么. 思路 容易想到用链表模拟删除,但是不能每次都暴力枚举,这样复杂度O(N^2).想到每次删除元素的 ...

  6. 5、链表队列(java实现)

    1.图例 2.链表节点 public class Node<T> { public T data; public Node next; } 3.具体实现 public class Link ...

  7. Python列表操作与深浅拷贝(5)——数字处理函数、类型判断、列表链表队列栈

    python内建数据结构 分类 数值型: int float complex bool 序列对象: 字符串str 列表list 元组tuple 键值对: 集合set 字典dict 数值型 (list ...

  8. java并发编程工具类JUC第四篇:LinkedBlockingQueue链表队列

    在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue. LinkedBlockingQueue 队列是Blo ...

  9. golang数据结构和算法之QueueLinkedList链表队列

    队列和堆栈不一样的地方在于进出顺序: 堆栈是后进先出, 队列是先进先出. QueueLinkedList.go package QueueLinkedList type Node struct { d ...

  10. AcWing 851. spfa求最短路 边权可能为负数。 链表 队列

    #include <cstring> #include <iostream> #include <algorithm> #include <queue> ...

随机推荐

  1. npm代理 -- 解决在公司内网如何装包的问题

    什么是Npm代理 npm代理指的是npm包管理器在使用时通过代理访问npm服务器获取依赖包的过程.在某些情况下,我们需要npm走代理才能访问到npm服务器,否则会出现timeout的错误.那下面我们就 ...

  2. vscode自定义运行和调试创建launch.json文件及项目独立配置文件

    1.创建lauch.json文件 2.然后在项目目录中会自动创建.vscode的目录 3.在.vscode目录下创建settings.json项目独立配置文件 4.在settings.json中写入 ...

  3. 【Java复健指南12】OOP高级03-抽象类与接口

    抽象类 引出 问题: ​ 父类方法有时候具有不确定性 小结: 当父类的某些方法,需要声明,但是又不确定如何实现 时,可以将其声明为抽象方法,那么这个类就是抽象类 例子: public class Ab ...

  4. Gitlab中的打包作业完成后,更新http服务器里的版本号文件

    背景 在.gitlab-ci.yml里面,我们有4个场景 dotnet build.dotnet pack和dotnet push 单元测试 SSH到http服务器,更新对应的版本号文件里面的版本数字 ...

  5. 【Azure 存储服务】Storage Account Blob 使用REST API如何获取磁盘大小(Content-Length), IOPS信息

    问题描述 1)关于使用Rest API获取非托管磁盘信息比如获取磁盘大小 2)关于使用Rest API获取非托管磁盘信息比如iops 问题答案 #1:关于使用Rest API获取非托管磁盘信息比如获取 ...

  6. Nebula Graph 源码解读系列 | Vol.03 Planner 的实现

    上篇我们讲到 Validator 会将由 Parser 生成的抽象语法树(AST)转化为执行计划,这次,我们来讲下执行计划是如何生成的. 概述 Planner 是执行计划(Execution Plan ...

  7. Redis单线程为什么如此之快

    一.概述 Redis的高并发和快简单可以归结为一下几点: 1.Redis是基于内存的: 2.Redis是单线程的: 3.Redis使用多路复用技术. 4.高效的数据结构 但具体怎么做的呢,下面来详细看 ...

  8. 6、mysql的SQL优化

    1. 大批量插入数据 1) 主键顺序插入 因为InnoDB类型的表是按照主键的顺序保存的,所以将导入的数据按照主键的顺序排列,可以有效的提高导入数据的效率.如果InnoDB表没有主键,那么系统会自动默 ...

  9. vite环境配置mockjs

    mockjs使用文档v2.9.6 安装插件 npm i mockjs -S npm i vite-plugin-mock@2.9.6 配置vite.config.ts文件 export default ...

  10. dev-sidecar 让github 可以正常访问

    dev-sidecar https://gitee.com/docmirror/dev-sidecar/releases