【数据结构与算法】使用单链表实现队列:原理、步骤与应用
💓 博客主页:倔强的石头的CSDN主页
📝Gitee主页:倔强的石头的gitee主页
⏩ 文章专栏:《数据结构与算法》
期待您的关注
目录
一、引言
🎄队列的概念
🎄为什么要用单链表实现队列
二、单链表前情回顾
三、队列的结构定义
🍃单个元素的结构定义
🍃队列的结构定义
🍃图解单链表与队列的关系
四、队列的接口实现
🌾初始化
🌾销毁
🌾入队列(队尾插入)
🌾出队列(队头删除)
🌾获取队首元素
🌾获取队尾元素
🌾获取队列元素个数
🌾队列判空
五、C语言实现代码
Queue.h 队列头文件
Queue.c 队列实现文件
test.c main函数测试文件
测试结果
六、应用场景
七、总结
一、引言
🎄队列的概念
队列(Queue)是一种特殊类型的线性数据结构,它遵循特定的操作顺序。队列的基本操作通常是在一端添加元素(称为入队或enqueue),在另一端移除元素(称为出队或dequeue)。这种操作特性使得队列符合“先进先出”(FIFO, First In First Out)的原则。
基本概念:
先进先出(FIFO)原则:这是队列的核心特性。它意味着最早被添加到队列中的元素将是第一个被移除的元素。这个原则确保了数据处理的顺序性。
队头(Front):队列中第一个被添加的元素位于队头,但它不是永远位于队列的第一个位置,而是指按照入队顺序,最先应该被出队的元素的位置。在出队操作中,总是从队头移除元素。
队尾(Rear)或队末:新元素总是被添加到队列的这一端。在入队操作中,新元素总是被放置在队尾。
队列为空:当队列中没有元素时,称队列为空队列。
队列满:在某些实现中,特别是使用静态数组实现的队列,当队列无法再添加新元素时,称为队列满。但在使用链表实现的队列中,通常不会遇到队列满的情况,因为链表可以动态扩展。
队列提供了一种有效的方式来管理和处理需要按照特定顺序执行的任务或数据项。通过使用队列,可以确保数据项按照它们被接收或生成的顺序进行处理,这是许多应用中非常关键的要求。
🎄为什么要用单链表实现队列
动态内存分配:
单链表节点是动态分配的,这意味着队列的大小可以根据需要动态地增长和缩小。与静态数组实现的队列不同,单链表队列不需要预先定义最大的容量,从而避免了因队列容量不足而导致的内存溢出问题。高效操作:
在单链表队列中,入队(enqueue)操作通常只需要在链表尾部添加一个节点,时间复杂度为O(1)。出队(dequeue)操作也只需要删除链表头部的节点,时间复杂度同样为O(1)。这使得单链表队列在处理大量数据时具有较高的效率。而数组不方便头插或头删,不管将数组的首部当作队首还是队尾都会降低效率内存利用率:
单链表队列在添加和删除元素时,只需要分配或释放单个节点的内存,而不需要像数组那样可能需要分配或释放整个数据块的内存。这有助于减少内存碎片,提高内存利用率。另外队列只需要对首尾元素进行操作,带尾指针的单链表已经足够高效的进行插入删除,相比双向链表节省了一半的指针空间。灵活性:
单链表队列在结构上相对灵活,可以根据具体需求进行扩展或修改。例如,可以在节点中添加额外的信息以支持更复杂的操作,或者在链表中插入或删除节点以实现特定的功能。易于实现:
单链表的基本操作(如添加节点、删除节点等)相对简单,因此使用单链表实现队列也相对容易。这使得初学者能够更容易地理解和实现队列数据结构。适应性强:
在实际应用中,队列可能会遇到各种复杂的情况,如并发访问、数据异常等。单链表队列由于其动态性和灵活性,能够较好地适应这些复杂情况。例如,在并发环境下,可以使用锁或其他同步机制来确保队列操作的原子性;在数据异常时,可以通过遍历链表来检查和处理异常情况。
二、单链表前情回顾
参考文章:
【C语言项目实战】使用单链表实现通讯录-CSDN博客
三、队列的结构定义
🍃单个元素的结构定义
- 数据部分
- 指向下一个元素的指针next
// 链式结构:表示队列
typedef int QDataType;
typedef struct QListNode
{struct QListNode* next;QDataType data;
}QNode;
🍃队列的结构定义
- 指向队首元素的指针phead
- 指向队尾元素的指针ptail
- 队列的元素个数size
// 队列的结构
typedef struct Queue
{QNode* head;QNode* tail;int size;
}Queue;
将队列的首尾指针封装成一个结构体,可以方便函数调用,统一接口
另外使用一个整型变量记录元素个数,利于其他函数功能实现
🍃图解单链表与队列的关系
四、队列的接口实现
🌾初始化
- 对形参判空(接收的地址必须是有效的(队列必须存在)
- 队列的首尾指针初始化为NULL
- size变量初始化为0
// 初始化队列
void QueueInit(Queue* q)
{assert(q);//接收的地址必须是有效的(队列必须存在)q->head = q->tail = NULL;q->size = 0;
}
🌾销毁
- 对形参判空
- 创建指针循环遍历链表: 每次记录下指针的下一个节点,释放指针指向的节点,指针指向下一个节点
- 出循环后,将首尾指针指向NULL
- size置0
// 销毁队列
void QueueDestroy(Queue* q)
{assert(q);while (q->head)//释放所有节点{QNode* next = q->head->next;free(q->head);q->head = next;}q->head = q->tail = NULL;q->size = 0;
}
🌾入队列(队尾插入)
- 接收两个参数,队列的地址和要插入的数据
- 首先,对形参指针判空
- 然后申请新节点,next指针指向NULL,数据部分为要插入的数据
- 接下来,对空队列和非空队列分别处理:
- 空队列直接让首尾指针都指向新节点
- 非空队列:尾指针指向节点的next指针指向新节点,尾指针再指向新节点
- 完成插入之后,size++
// 队尾入队列
void QueuePush(Queue* q, QDataType data)
{assert(q);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL)//判定是否申请成功{perror("newnode error\n");exit(1);}newnode->data = data;newnode->next = NULL;if (q->head == NULL)//对空队列入队的处理{q->head = q->tail = newnode;}else //对非空队列入队的处理{q->tail->next = newnode;q->tail = newnode;}q->size++;
}
🌾出队列(队头删除)
- 对形参判空
- 对队列判空
- 队首删除分两种情况
- 队列只有一个元素的情况: 释放该元素空间,首尾指针都指向NULL
- 队列有多个元素的情况: 记录下第二个节点地址,释放首节点,首指针指向第二个节点
- 删除完节点之后,size--
// 队头出队列
void QueuePop(Queue* q)
{assert(q);assert(q->head);//队列不能为空if (q->head == q->tail)//对只有一个元素的队列的出队处理{free(q->head);q->head = q->tail = NULL;}else //对存在多个元素的队列的出队处理{QNode* next = q->head->next;free(q->head);q->head = next;}q->size--;
}
🌾获取队首元素
- 形参判空
- 队列判空
- 返回队首元素的数据
// 获取队列头部元素
QDataType QueueFront(Queue* q)
{assert(q);assert(q->head);//队列不能为空return q->head->data;
}
🌾获取队尾元素
- 形参判空
- 队列判空
- 返回队尾元素的数据
// 获取队列队尾元素
QDataType QueueBack(Queue* q)
{assert(q);assert(q->head);return q->tail->data;
}
🌾获取队列元素个数
- 形参判空
- 返回size
// 获取队列中有效元素个数
int QueueSize(Queue* q)
{assert(q);return q->size;
}
🌾队列判空
- 形参判空
- 返回size==0的结果
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
int QueueEmpty(Queue* q)
{assert(q);return q->size == 0;
}
五、C语言实现代码
Queue.h 队列头文件
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>// 链式结构:表示队列
typedef int QDataType;
typedef struct QListNode
{struct QListNode* next;QDataType data;
}QNode;// 队列的结构
typedef struct Queue
{QNode* head;QNode* tail;int size;
}Queue;// 初始化队列
void QueueInit(Queue* q);
// 队尾入队列
void QueuePush(Queue* q, QDataType data);
// 队头出队列
void QueuePop(Queue* q);
// 获取队列头部元素
QDataType QueueFront(Queue* q);
// 获取队列队尾元素
QDataType QueueBack(Queue* q);
// 获取队列中有效元素个数
int QueueSize(Queue* q);
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
int QueueEmpty(Queue* q);
// 销毁队列
void QueueDestroy(Queue* q);
Queue.c 队列实现文件
#include"Queue.h"// 初始化队列
void QueueInit(Queue* q)
{assert(q);//接收的地址必须是有效的(队列必须存在)q->head = q->tail = NULL;q->size = 0;
}// 队尾入队列
void QueuePush(Queue* q, QDataType data)
{assert(q);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL)//判定是否申请成功{perror("newnode error\n");exit(1);}newnode->data = data;newnode->next = NULL;if (q->head == NULL)//对空队列入队的处理{q->head = q->tail = newnode;}else //对非空队列入队的处理{q->tail->next = newnode;q->tail = newnode;}q->size++;
}// 队头出队列
void QueuePop(Queue* q)
{assert(q);assert(q->head);//队列不能为空if (q->head == q->tail)//对只有一个元素的队列的出队处理{free(q->head);q->head = q->tail = NULL;}else //对存在多个元素的队列的出队处理{QNode* next = q->head->next;free(q->head);q->head = next;}q->size--;
}// 获取队列头部元素
QDataType QueueFront(Queue* q)
{assert(q);assert(q->head);//队列不能为空return q->head->data;
}// 获取队列队尾元素
QDataType QueueBack(Queue* q)
{assert(q);assert(q->head);return q->tail->data;
}// 获取队列中有效元素个数
int QueueSize(Queue* q)
{assert(q);return q->size;
}// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
int QueueEmpty(Queue* q)
{assert(q);return q->size == 0;
}// 销毁队列
void QueueDestroy(Queue* q)
{assert(q);while (q->head)//释放所有节点{QNode* next = q->head->next;free(q->head);q->head = next;}q->head = q->tail = NULL;q->size = 0;
}
test.c main函数测试文件
#include"Queue.h"void test1()
{Queue Q;QueueInit(&Q);//创建队列并初始化if (QueueEmpty(&Q))printf("队列空\n");elseprintf("队列非空\n");QueuePush(&Q, 1);//队列插入四个数据QueuePush(&Q, 2);QueuePush(&Q, 3);QueuePush(&Q, 4);if (QueueEmpty(&Q))printf("队列空\n");elseprintf("队列非空\n");printf("%d\n", QueueBack(&Q));//取队尾数据while (Q.size)//队列不为空时,每次取队首数据,再出队列{printf("%d ", QueueFront(&Q));QueuePop(&Q);}printf("\n");if (QueueEmpty(&Q))printf("队列空\n");elseprintf("队列非空\n");QueueDestroy(&Q);//队列销毁
}int main()
{test1();return 0;
}
测试结果
六、应用场景
单链表队列的应用场景非常广泛,几乎在所有需要按照特定顺序处理数据的情况下都可以看到它的身影。以下是一些具体的应用场景示例:
操作系统中的任务调度:在操作系统中,任务(如进程或线程)经常需要按照某种顺序(如优先级、到达时间等)被调度执行。队列可以很好地满足这种需求,确保任务按照预定的顺序被处理。使用单链表实现的队列能够动态地添加和删除任务,非常适合这种场景。
数据包缓冲处理:在网络通信中,数据包经常需要在一个缓冲区中等待处理。队列结构能够确保数据包按照接收的顺序被处理,避免了乱序问题。单链表队列可以方便地添加新接收的数据包到队尾,并从队头取出数据包进行处理。
打印机任务队列:在打印多个文档时,打印机会按照接收文档的顺序进行打印。使用队列可以确保文档按照正确的顺序被处理。单链表队列可以动态地添加新的打印任务,并从队头取出任务进行打印。
事件驱动编程:在事件驱动编程模型中,事件(如用户输入、定时器事件等)会被放入一个事件队列中等待处理。使用队列可以确保事件按照发生的顺序被处理,避免了并发事件导致的混乱。单链表队列可以方便地添加新事件到队尾,并从队头取出事件进行处理。
游戏开发:在游戏中,经常需要处理大量的游戏对象(如玩家、怪物、子弹等)。使用队列可以确保这些对象按照特定的顺序(如创建顺序、优先级等)被更新或渲染。单链表队列可以动态地添加和删除游戏对象,提高游戏的性能和响应速度。
七、总结
通过本文的介绍,我们了解了如何使用单链表来实现队列,并探讨了其在实际应用中的重要性和应用场景。单链表队列具有动态分配内存、无需预先定义大小等优点,能够方便地添加和删除元素,满足各种按照顺序处理数据的需求。无论是在操作系统、网络通信、打印机任务处理、事件驱动编程还是游戏开发中,我们都可以看到单链表队列的身影。因此,掌握单链表队列的实现原理和应用方法对于程序员来说是非常有必要的。希望本文能够帮助读者更好地理解单链表队列的概念和应用,并在实际项目中灵活运用。
相关文章:
【数据结构与算法】使用单链表实现队列:原理、步骤与应用
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法》 期待您的关注 目录 一、引言 🎄队列的概念 🎄为什么要用单链表实现队列 二、单…...
DHCP服务
文章目录 一、DHCP介绍二、DHCP应用场景三、DHCP工作原理3.1)工作方式3.2)工作原理解析3.3)计算机获得IP的时间点3.4)租约更新阶段 四、DHCP服务器部署4.1)DHCP安装4.2)DHCP配置文件详解4.3)DHCP启动 五、D…...
C++笔试-剑指offer
剑指offer 文章目录 剑指offer数组[数组中重复的数据 ](https://leetcode.cn/problems/find-all-duplicates-in-an-array/description/)将元素交换到对应的位置 二维数组中的查找二叉搜索树 旋转数组的最小数字二分查找 数组中出现次数超过一半的数字相互抵消 连续子数组的最大…...
Mac安装jadx并配置环境
jadx官网:GitHub - skylot/jadx: Dex to Java decompiler 第一种: 安装jadx命令: brew install jadx 启动jadx-gui命令: jadx-gui 可能遇到的问题: Downloading https://formulae.brew.sh/api/formula.jws.json** h…...
前端学习----css基础语法
CSS概述 CAscading Style Sheets(级联样式表) CSS是一种样式语言,用于对HTML文档控制外观,自定义布局等,例如字体,颜色,边距等 可将页面的内容与表现形式分离,页面内容存放在HTML文档中,而用于定义表现形式的CSS在一个.css文件中或HTML文档的某一部分 HTML与CSS的关系 HTM…...
超详解——python条件和循环——小白篇
目录 1. 缩进和悬挂else 2. 条件表达式 3. 和循环搭配的else 4. 可调用对象 总结: 1. 缩进和悬挂else 在Python中,代码块是通过缩进来表示的。条件判断和循环结构的代码块需要正确缩进。悬挂else指的是else子句和相应的if或循环在同一级别的缩进。 …...
DNS协议 | NAT技术 | 代理服务器
目录 一、DNS协议 1、DNS背景 2、DNS协议 域名 域名解析 二、NAT技术 1、NAT技术 2、NAPT技术 3、NAT技术的缺陷 三、代理服务器 1、正向代理服务器 2、反向代理服务器 一、DNS协议 域名系统(Domain Name System,缩写:DNS&#…...
深入ES6:解锁 JavaScript 类与继承的高级玩法
个人主页:学习前端的小z 个人专栏:JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! ES5、ES6介绍 文章目录 💯Class🍟1 类的由来🍟2 co…...
领域驱动设计:异常处理
一、异常的处理 异常处理是领域模型要考虑的一部分,原因在于模型的责任不可能无限大。在遇到自己处理能力之外的情况时,要采用异常机制报告错误,并将处理权转交。异常就是这样一种机制,某种程度上,它可以保证领域模型…...
网络网络层之(6)ICMPv6协议
网络网络层之(6)ICMPv6协议 Author: Once Day Date: 2024年6月2日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客-CS…...
《大道平渊》· 拾壹 —— 商业一定是个故事:讲好故事,员工奋发,顾客买单。
《大道平渊》 拾壹 "大家都在喝,你喝不喝?" 商业一定是个故事,人民群众需要故事。 比如可口可乐的各种故事。 可口可乐公司也只是被营销大师们, 作为一种故事载体,发挥他们的本领。 营销大师们开发故事…...
JavaScript 如何访问本地文件夹
在浏览器环境中的JavaScript(通常指的是前端JavaScript)由于安全限制,无法直接访问用户的本地文件或文件夹。这是为了防止恶意脚本访问并窃取用户的敏感数据。 但是,有几种方法可以间接地让用户选择并访问本地文件: 使…...
ArrayList顺序表简单实现
一、创建MyArrayList框架 1.1 MyArrayList 类中实现 arr 数组 import java.util.Arrays;public class MyArrayList {private int[] arr;private int usesize;private static final int P 10;public MyArrayList() {arr new int[P];} 在 MyArrayList 类内创建 arr 数组&…...
144、二叉树的前序递归遍历
题解: 递归书写三要素: 1)确定递归函数的参数和返回值。要确定每次递归所要用到的参数以及需要返回的值 2)确定终止条件。操作系统也是用栈的方式实现递归,那么如果不写终止条件或者终止条件写的不对,都…...
youtube 1080 分辨率 下载方式
YouTube 1080p Video Downloader 这张图像代表了Autodesk Maya中一个名为rocket_body_MAT的材质的着色器网络。下面是对节点及其连接的细分: 节点 place2dTexture12: 该节点用于控制2D纹理在表面上的位置映射。输出: Out UVrocket_body2.jpg: 该节点代表一个纹理文件,具体是…...
计算机网络ppt和课后题总结(下)
常用端口总结 计算机网络中,端口是TCP/IP协议的一部分,用于标识运行在同一台计算机上的不同服务。端口号是一个16位的数字,范围从0到65535。通常,0到1023的端口被称为“熟知端口”或“系统端口”,它们被保留给一些标准…...
测试基础12:测试用例设计方法-边界值分析
课程大纲 1、定义 经验发现,较多的错误往往发生在输入或输出范围的边界上,因为边界值是代码判断语句的点,一般容易出问题(数值写错、多加或丢失等号、写错不等号方向…)。所以增加对取值范围的边界数据的测试ÿ…...
AI大模型在健康睡眠监测中的深度融合与实践案例
文章目录 1. 应用方案2. 技术实现2.1 数据采集与预处理2.2 构建与训练模型2.3 个性化建议生成 3. 优化策略4. 应用示例:多模态数据融合与实时监测4.1 数据采集4.2 实时监测与反馈 5. 深入分析模型选择和优化5.1 LSTM模型的优势和优化策略5.2 CNN模型的优势和优化策略…...
【西瓜书】9.聚类
聚类任务是无监督学习的一种用于分类等其他任务的前驱过程,作为数据清洗,基于聚类结果训练分类模型 1.聚类性能度量(有效性指标) 分类任务的性能度量有错误率、精度、准确率P、召回率R、F1度量(P-R的调和平均)、TPR、FPR、AUC回归…...
使用jemalloc实现信号驱动的程序堆栈信息打印
使用jemalloc实现信号驱动的程序堆栈信息打印 本文介绍应用如何集成jemalloc,在接收到SIGUSR1信号10时打印程序的堆栈信息。 1. 编译jemalloc 首先,确保你已经编译并安装了启用prof功能的jemalloc。以下是ubuntu18.04上的编译步骤: git c…...
树的4种遍历
目录 树的四种遍历方式的总结 1. 前序遍历(Pre-order Traversal) 2. 中序遍历(In-order Traversal) 3. 后序遍历(Post-order Traversal) 4. 层序遍历(Level-order Traversal 或 广度优先遍…...
深入探讨5种单例模式
文章目录 一、对比总览详细解释 二、代码1. 饿汉式2. 饱汉式3. 饱汉式-双检锁4. 静态内部类5. 枚举单例 三、性能对比 一、对比总览 以下是不同单例模式实现方式的特性对比表格。表格从线程安全性、延迟加载、实现复杂度、反序列化安全性、防反射攻击性等多个方面进行考量。 …...
SPOOL
-----How to Pass UNIX Variable to SPOOL Command (Doc ID 1029440.6) setenv只有csh才有不行啊PROBLEM DESCRIPTION: You would like to put a file name in Unix and have SQL*Plus read that file name, instead of hardcoding it, because it will change.You want to pa…...
挑战绝对不可能:再证有长度不同的射线
黄小宁 一空间坐标系中有公共汽车A,A中各座位到司机处的距离h是随着座位的不同而不同的变数,例如5号座位到司机处的距离是h3,…h5,…。A移动了一段距离变为汽车B≌A,B中5号座位到司机处的距离h’h3,…h’h5…...
【机器学习】Python与深度学习的完美结合——深度学习在医学影像诊断中的惊人表现
🔥 个人主页:空白诗 文章目录 一、引言二、深度学习在医学影像诊断中的突破1. 技术原理2. 实际应用3. 性能表现 三、深度学习在医学影像诊断中的惊人表现1. 提高疾病诊断准确率2. 辅助制定治疗方案 四、深度学习对医疗行业的影响和推动作用 一、引言 随着…...
MapStruct的用法总结及示例
MapStruct是一个代码生成器,它基于约定优于配置的原则,使用Java注解来简化从源对象到目标对象的映射过程。它主要用于减少样板代码,提高开发效率,并且通过编译时代码生成来保证性能。 我的个人实践方面是在2021年前那时候在项目中…...
redis 05 复制 ,哨兵
01.redis的复制功能,使用命令slaveof 2. 2.1 2.2 3. 3.1 3.1.1 3.1.2 3.1.3 4 4.1 4.2 例子 5.1 这里是从客户端发出的指令 5.2 套接字就是socket 这里是和redis事件相关的知识 5.3 ping一下...
强大的.NET的word模版引擎NVeloDocx
在Javer的世界里,存在了一些看起来还不错的模版引擎,比如poi-tl看起来就很不错,但是那是人家Javer们专属的,与我们.Neter关系不大。.NET的世界里Word模版引擎完全是一个空白。 很多人不得不采用使用Word XML结合其他的模版引擎来…...
MySQL中所有常见知识点汇总
存储引擎 这一张是关于整个存储引擎的汇总知识了。 MySQL体系结构 这里是MySQL的体系结构图: 一般将MySQL分为server层和存储引擎两个部分。 其实MySQL体系结构主要分为下面这几个部分: 连接器:负责跟客户端建立连 接、获取权限、维持和管理…...
Flink 基于 TDMQ Apache Pulsar 的离线场景使用实践
背景 Apache Flink 是一个开源的流处理和批处理框架,具有高吞吐量、低延迟的流式引擎,支持事件时间处理和状态管理,以及确保在机器故障时的容错性和一次性语义。Flink 的核心是一个分布式流数据处理引擎,支持 Java、Scala、Pytho…...
国内vps做网站要备案吗/自助发外链网站
夜光序言: 人有了物质才能生存;人有了理想才谈得上生活。你要了解生存与生活的不同吗?动物生存,而人则生活。 正文: 1:ctrl/ : 可以用显示灰色,那个东西 ctrl/shift:用于注释一个部分 <!D…...
中国万网官方网站/关键词排名软件
可读性 表面上看来,可读性似乎很主观。不同语言、代码、和团队对于可读性的定义不尽相同。但如果深入本质的话,就会发现代码可读性有一些非常关键的因素。 许多程序员太倾向于计算机了,只要程序能运行就一了百了。尽管是老生常谈,…...
网站的作用和意义/成都网络推广优化
出处未知在linux的PC上挂载jffs2根文件系统映像因为jffs2是构建于MTD设备上的文件系统,所以无法通过loop设备来挂载,但是可以通过mtdram设备来挂载。mtdram是在用RAM实现的 MTD设备,可以通过mtdblock设备来访问。使用mtdram设备很简单&#x…...
动态网站建设优缺点/百度推广竞价排名技巧
在centos中安装docker Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。在很多版本的CentOS中是不支持更新最新的一些补丁包的。 我这里将Docker安装到阿里云CentOS上。注意&#…...
做网站得做多少网页/中国公关公司前十名
MineCraft是一款专门为用户设计的模拟经营提醒,以建设和破坏为主,去创造属于你自己的世界,此软件主要是帮助玩家搭建我的世界服务器端,让你从此联机乐无穷,你还在等什么赶紧下载吧!游戏介绍《MineCraft》是…...
简述如何让网站排名快速提升/手机百度下载安装
展开全部平时我们e68a843231313335323631343130323136353331333361323565在使用MySQL的时候,对于MySQL中的NULL值和空值区别不能很好的理解。注意到NULL值是未知的,且占用空间,不走索引,DBA建议建表的时候最好设置字段是NOT NULL …...