链表队列(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> ...
随机推荐
- win32 - 将线程重定向到另一个函数(附带Suspend的解释)
Suspend: 挂起指定的线程 备注:不要永远挂起线程, 因为在Win32中,进程堆是线程安全的对象,并且由于在不访问堆的情况下很难在Win32中完成很多工作,因此在Win32中挂起线程极有可能使进 ...
- 深入解析Python并发编程的多线程和异步编程
本文分享自华为云社区<Python并发编程探秘:多线程与异步编程的深入解析>,作者:柠檬味拥抱. 在Python编程中,多线程是一种常用的并发编程方式,它可以有效地提高程序的执行效率,特别 ...
- proc_sys_reset 复位时序
proc_sys_reset 模块时序 下面为仿真时序,这里做一个record , 后面有使用问题可以参考该时序: 点击查看代码 module test( ); bit slowest_sync_cl ...
- 从零开始学Spring Boot系列-返回json数据
欢迎来到从零开始学Spring Boot的旅程!在Spring Boot中,返回JSON数据是很常见的需求,特别是当我们构建RESTful API时.我们对上一篇的Hello World进行简单的修改 ...
- 【Azure 应用服务】遇见“无法创建hybrid connection for App Service”的解决办法
Hybrid Connection (混合连接) 在两个联网应用程序之间启用了双向.请求-响应和二进制流通信以及简单的数据报流.通过混合连接,可以实现应用部署在公网环境中,而数据库保存在本地私网环境中 ...
- [Python] 端口转发代码分享
我的魔法被公司防火墙限制了,所以我只能让我的代理流量从我自己的服务器过一遍,但是服务器上面的客户端只能允许本机使用,不能开放公网访问,所以就想到了端口转发 但是网络上面找到的端口转发工具需要各种配置, ...
- 候捷-C++面向对象高级开发
目录 笔记参考 学习目标 complex类 构造函数 常量成员函数 参数传递 函数返回值 临时对象 友元 string类 三大函数 堆.栈与内存管理 扩展补充:类模板.函数模板及其他 继承.复合.委托 ...
- arch安装deep-wine-wechat时,跳过md5检测的方法
yay -S --mflags --skipinteg deepin-wine-wechat 这条命令是的我们跳过了md5检测! 微信的安装位置:C:\Program Files\Tencent\We ...
- 向TreeView添加自定义信息
可在 Windows 窗体 TreeView 控件中创建派生节点,或在 ListView 控件中创建派生项. 通过派生可添加任何所需字段,以及添加处理这些字段的自定义方法和构造函数. 此功能的用途之一 ...
- Android编译系统
一.概述 在 Android 7.0 之前,Android 编译系统使用 GNU Make 描述和shell来构建编译规则,模块定义都使用Android.mk进行定义,Android.mk的本质就是M ...