链表队列(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> ...
随机推荐
- 《系列二》-- 3、FactoryBean 的使用
目录 FactoryBean 解决的问题 FactoryBean 接口初识 改造结果 最后的补充 回顾下 FactoryBean 的应用 factory-method 和 factory-bean 的 ...
- 如何编写一个 PowerShell 脚本
PowerShell 脚本的后缀是 .ps1 前提: ps1 脚本可以帮忙我们快速修改文件内容,还不需要调用文件的底层 api,方便快捷 在编写 CMakeLists 时发现,项目不能够很好的使用 v ...
- 【Android 逆向】apk反编译后重打包
1. 执行 apktool b smali_dir smali_dir 为反编译出来的数据目录 执行后可能会报错 I: Building resources... W: /root/Desktop/t ...
- pikachu SQL-inject insert/update注入
insert 注入 (修改信息处是update注入,和此处同理) 注册页面,用户处输入 1' 发现报错信息 You have an error in your SQL syntax; check th ...
- 具备有效期的localStorage存储
具备有效期的localStorage存储 类方式 // 具备有效期的localStorage存储-类方式. class LocalStorageWrapper { // 存储数据到localStora ...
- 【Azure App Service】同一个App Service下创建多个测试站点的方式
问题描述 在一个App Service中,部署多个应用,每个应用相互独立,类似与IIS中在根目录下创建多个子应用的情况. 问题解答 可以的.通过App Service Configuration页面, ...
- 【Azure Spring Cloud】Azure Spring Cloud connect to SQL using MSI
问题描述 在Azure Spring Cloud中,通过ActiveDirectoryMSI方式来连接到SQL Service,需要如何配置呢? 问题分析 在SQL Service中启用Active ...
- Jpackage-制作无需预装Java环境的Jar可执行程序
JAR 包要在预装 JRE 环境的系统上执行.如果没有预先安装 JRE 环境,又想直接运行 Java 程序,该怎么办呢? 这篇文章我们会先学习如何将 Java 程序打包成一个可执行的 Java JAR ...
- Spring Cloud 系列之Hystrix、Ribbon、Feign 源码剖析(一)引子
系列目录 Spring Cloud 系列之Hystrix.Ribbon.Feign 源码剖析(一)引子 Spring Cloud 系列之Hystrix.Ribbon.Feign 源码剖析(二)原理概括 ...
- [学习笔记] Linux 环境下搭建基于Ngnix的反向代理服务
之前为了方便同事测试微信小程序,搭建了基于CentOS的预发布环境,.Net5 程序也已经部署好在上面,在公网上可以通过http协议的临时域名(jevonsflash.xxx.net)访问到后台Ap ...