【数据结构与算法】03 队列(顺序队列--循环队列--优先级队列--链队列)
- 一、概念
- 1.1 队列的基本概念
- 1.2 队列的顺序存储结构
- 1.21 顺序队列(静态队列)
- 1.22 循环队列
- 1.23 优先级队列
- 1.3 队列的链式存储结构
- 二、C语言实现
- 2.1 顺序存储
- 2.11 顺序队列
- 2.12 循环队列
- 2.13 优先级队列
- 2.2 链式存储
一、概念
1.1 队列的基本概念
队列(queue
)是一种常见的数据结构,它遵循先进先出(FIFO)的原则。队列可以理解为一个具有两个端点的线性数据结构,其中一个端点称为"队尾"(rear),用于插入新元素,另一个端点称为"队首"(front),用于移除元素。新元素被插入到队尾,而最早插入的元素总是在队首。
队列的特点如下:
- 元素按照插入顺序排列,最先插入的元素在队列中的位置最靠前,即队首。
- 只能从队首移除元素,而只能在队尾插入新元素,遵循先进先出的原则。
- 队列的长度可以动态变化,根据插入和移除操作进行调整。
队列常常用于需要按照先后顺序处理数据的场景,例如任务调度、消息传递、广度优先搜索等。
队列的基本操作包括:
- 入队(Enqueue):将新元素插入到队尾。
- 出队(Dequeue):移除队首的元素,并返回该元素。
- 队列是否为空(isEmpty):判断队列是否为空。
- 队列长度(size):返回队列中元素的个数。
- 获取队首元素(front):返回队首元素,但不移除它。
队列可以通过不同的数据结构来实现,常见的实现方式包括使用数组或链表。
使用数组实现的队列称为顺序队列,而使用链表实现的队列称为链式队列。此外,还有循环队列,它使用数组实现,通过循环利用数组空间来提高效率。
1.2 队列的顺序存储结构
1.21 顺序队列(静态队列)
顺序队列是一种使用数组实现的队列(array-based),它是队列的一种常见实现方式。顺序队列的特点是元素按照插入顺序排列,并且只能从队首移除元素,从队尾插入新元素,遵循先进先出(FIFO)的原则。
顺序队列的实现依赖于一个固定大小的数组,通过数组的索引来表示队列的头部和尾部。以下是顺序队列的一些关键操作:(假设队首、队尾索引都初始化为0,这样队首索引=队首元素索引;队尾索引等于队尾元素索引+1。理解意思即可)
- 入队(Enqueue):将新元素插入到队尾。当有元素需要入队时,需要将其插入到数组的尾部,并更新队尾的索引。
- 出队(Dequeue):移除队首的元素,并返回该元素。出队操作需要将队首元素移除,并更新队首的索引。
- 队列是否为空(isEmpty):判断队列是否为空。当队首和队尾的索引相等时,表示队列为空。
- 队列是否已满(isFull):判断队列是否已满。当队尾的索引达到数组的最大容量时,表示队列已满,无法插入新元素。
- 队列长度(size):返回队列中元素的个数。计算方法是队尾索引减去队首索引。
- 获取队首元素(front):返回队首元素,但不移除它。可以直接通过队首索引来访问数组中的元素。
- 顺序队列的优点是实现简单、操作高效,入队和出队的时间复杂度均为O(1)。
- 但是顺序队列的缺点是固定大小,当队列已满时无法插入新元素,且需要移动元素位置来保持队列的连续性,导致效率降低。
为了解决空间利用率低的问题,还可以使用循环队列,它使用数组实现,并通过循环利用数组空间来提高效率。循环队列的实现方式使得插入和删除操作都能在常数时间内完成,而不需要移动元素位置。
1.22 循环队列
循环队列(circular queue
)是一种基于数组实现的队列数据结构,它解决了普通队列在出队操作后浪费存储空间的问题。循环队列的特点是队尾和队头可以通过取模运算实现循环移动。
循环队列的主要特点和实现细节:
- 使用数组实现:循环队列使用数组作为底层数据结构,通过索引来访问队列中的元素。
- 队首和队尾指针:循环队列使用两个指针来标记队列的头部和尾部。通常使用 front 指针表示队首元素的位置,rear 指针表示队尾元素的位置。
- 空队列判断:当 front 和 rear 指针指向同一个位置时,队列为空(也可以用一个变量实时记录队列元素个数,方便不少)。
- 满队列判断:当
(rear + 1) % capacity = front
时,队列为满(capacity:数组大小)。 - 入队操作:向循环队列中插入元素时,先判断队列是否已满。如果队列未满,将元素插入到 rear 指针指向的位置,并将 rear 指针向后移动一位(
rear = (rear + 1) % capacity
)。 - 出队操作:从循环队列中删除元素时,先判断队列是否为空。如果队列不为空,将 front 指针向后移动一位(
front = (front + 1) % capacity
)。 - 遍历队列:可以使用循环遍历队列中的所有元素,从 front 指针开始逐个移动并访问元素,直到 front 指针与 rear 指针相等。
入队图示:
循环队列的优点是能够更有效地利用存储空间,避免了数据迁移的开销。它适用于需要频繁进行入队和出队操作的场景,例如消息队列、任务调度等。
但是,循环队列的容量需要预先确定,并且一旦确定后就不能改变。在实现循环队列时,需要合理处理指针的移动和边界条件,确保队列操作的正确性。
1.23 优先级队列
优先级队列(priority queue
)是一种特殊的队列,其中每个元素都关联有一个优先级。元素的优先级决定了其在队列中的位置和顺序。优先级高的元素在队列中排在前面,而优先级低的元素排在后面。
相关概念和操作:
- 元素优先级:每个元素都与一个优先级相关联,可以是数字、字符或其他可比较的类型。较高的优先级对应较高的值。
- 插入操作:将元素插入优先级队列时,根据元素的优先级将其放置在适当的位置。通常,较高优先级的元素被放置在队列的前面,而较低优先级的元素被放置在后面。
- 删除操作:从优先级队列中删除元素时,总是删除具有最高优先级的元素。这通常是队列的第一个元素。
- 更新操作:如果需要更改元素的优先级,可以更新元素在队列中的位置。这通常需要重新排序或调整队列的内部结构。
- 遍历操作:可以按照优先级顺序遍历优先级队列中的所有元素。这样可以按照优先级高低的顺序处理元素。
例:下图将高优先级的元素放在队首(这里数值越小优先级越高),相同优先级则遵循先进先出规则。
优先级队列常用于需要按照某种优先级顺序处理元素的场景。例如,任务调度器可以使用优先级队列来管理待执行的任务,确保高优先级任务优先执行。还可以在模拟系统中使用优先级队列来模拟事件的发生顺序。
在实现优先级队列时,可以使用各种数据结构,如链表、二叉搜索树或有序数组。这些数据结构提供了高效的插入、删除和查找操作,以满足优先级队列的需求。(本文使用数组实现)
在处理具有相同优先级的元素时,可以根据应用程序的需求使用先入先出(FIFO)规则或后入先出(LIFO)规则来确定元素的顺序。这决定了相同优先级的元素在队列中的相对位置。
1.3 队列的链式存储结构
链式队列是一种使用链表实现的队列数据结构。与数组队列相比,链式队列不需要预先指定固定大小,可以动态地添加和删除元素。
主要特点和实现细节:
- 链表结构:链式队列使用链表来存储元素。每个节点包含一个数据元素和一个指向下一个节点的指针。
- 头尾指针:链式队列维护两个指针,分别指向队列的头部和尾部节点。入队操作将新节点链接到尾部节点,并更新尾部指针。出队操作删除头部节点,并更新头部指针。
- 空队列处理:链式队列可以处理空队列的情况,即当队列为空时,出队操作将返回一个特定的值(如NULL)或引发异常。
- 动态大小:由于链式队列使用动态链表存储元素,它可以根据需要动态增长或缩小。这使得链式队列更加灵活,可以适应不同的元素数量和大小需求。
链式队列的优点包括灵活性和动态大小,适用于处理变化的元素数量。然而,与数组队列相比,链式队列需要额外的内存来存储节点指针,并且在访问特定位置的元素时需要遍历链表,可能导致一些性能开销。
在实现链式队列时,可以定义一个节点结构来表示链表中的每个节点,并使用指针来跟踪队列的头部和尾部。通过使用指针操作,可以在常量时间内执行入队和出队操作。
在多线程环境中使用链式队列时,需要考虑线程安全性和同步问题,以避免竞态条件和数据不一致的情况。可以使用互斥锁或其他同步机制来确保线程安全性。
二、C语言实现
记得是队尾插入,队首删除。
2.1 顺序存储
2.11 顺序队列
// 顺序队列
#include <stdio.h>#define MAX_SIZE 100// 定义队列结构体
typedef struct {int data[MAX_SIZE];int front; // 队首索引int rear; // 队尾索引
} Queue;// 初始化队列
void initQueue(Queue *queue) {queue->front = 0;queue->rear = 0;
}// 判断队列是否为空
int isEmpty(Queue *queue) {return (queue->front == queue->rear);
}// 判断队列是否已满
int isFull(Queue *queue) {return (queue->rear == MAX_SIZE);
}// 入队
void enqueue(Queue *queue, int item) {if (isFull(queue)) {printf("队列已满,无法插入元素\n");return;}queue->data[queue->rear] = item;queue->rear++;
}// 出队
int dequeue(Queue *queue) {if (isEmpty(queue)) {printf("队列为空,无法删除元素\n");return -1;}int item = queue->data[queue->front];queue->front++;return item;
}// 获取队列长度
int getQueueLength(Queue *queue) {return queue->rear - queue->front;
}int main() {Queue queue;initQueue(&queue);enqueue(&queue, 1);enqueue(&queue, 2);enqueue(&queue, 3);printf("队列长度: %d\n", getQueueLength(&queue));printf("出队元素: %d\n", dequeue(&queue));printf("出队元素: %d\n", dequeue(&queue));printf("队列长度: %d\n", getQueueLength(&queue));return 0;
}
2.12 循环队列
// 循环队列
#include <stdio.h>#define MAX_SIZE 100// 定义循环队列结构体
typedef struct {int data[MAX_SIZE];int front; // 队首索引int rear; // 队尾索引int size; // 直接用一个size来记录大小,简化空、满的判断
} CircularQueue;// 初始化循环队列
void initQueue(CircularQueue *queue) {queue->front = 0;queue->rear = 0;queue->size = 0;
}// 判断循环队列是否为空
int isEmpty(CircularQueue *queue) {return (queue->size == 0);
}// 判断循环队列是否已满
int isFull(CircularQueue *queue) {return (queue->size == MAX_SIZE);
}// 入队
void enqueue(CircularQueue *queue, int item) {if (isFull(queue)) {printf("循环队列已满,无法插入元素\n");return;}queue->data[queue->rear] = item;// 注意对队尾索引的计算,因为它是循环的 queue->rear = (queue->rear + 1) % MAX_SIZE;// 更新元素个数queue->size++;
}// 出队
int dequeue(CircularQueue *queue) {if (isEmpty(queue)) {printf("循环队列为空,无法删除元素\n");return -1;}int item = queue->data[queue->front];// 同理queue->front = (queue->front + 1) % MAX_SIZE;queue->size--;return item;
}// 获取循环队列长度
int getQueueLength(CircularQueue *queue) {return queue->size;
}int main() {CircularQueue queue;initQueue(&queue);enqueue(&queue, 1);enqueue(&queue, 2);enqueue(&queue, 3);printf("循环队列长度: %d\n", getQueueLength(&queue));printf("出队元素: %d\n", dequeue(&queue));printf("出队元素: %d\n", dequeue(&queue));printf("循环队列长度: %d\n", getQueueLength(&queue));return 0;
}
2.13 优先级队列
注意,优先级通常是数值越小,优先级越高。计算机领域通常都是这样的。(当然你也可以自定义)
#include <stdio.h>#define MAX_SIZE 100typedef struct {int value;int priority;
} Element;Element queue[MAX_SIZE];
int size = 0;void enqueue(int value, int priority) {if (size >= MAX_SIZE) {printf("Queue is full. Unable to enqueue.\n");return;}int i = size - 1;while (i >= 0 && queue[i].priority > priority) {queue[i + 1] = queue[i];i--;}queue[i + 1].value = value;queue[i + 1].priority = priority;size++;
}int dequeue() {if (size <= 0) {printf("Queue is empty. Unable to dequeue.\n");return -1; // Return a sentinel value indicating an error}int value = queue[0].value;for (int i = 1; i < size; i++) {queue[i - 1] = queue[i];}size--;return value;
}void traverse() {if (size <= 0) {printf("Queue is empty. Nothing to traverse.\n");return;}printf("Queue traversal: \n\t");for (int i = 0; i < size; i++) {printf("Val: %3d Prio: %d\n\t", queue[i].value, queue[i].priority);}printf("\n");
}int main() {enqueue(5, 3);enqueue(10, 1);enqueue(3, 6);traverse();int value = dequeue();printf("Dequeued value: %d\n", value);traverse();enqueue(888, 4);printf("Enter (888,4)\n");traverse();return 0;
}
2.2 链式存储
// 链队
#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node* next;
} Node;typedef struct {Node* front; // 队头指针Node* rear; // 队尾指针
} Queue;Queue* createQueue() {Queue* queue = (Queue*)malloc(sizeof(Queue));queue->front = NULL;queue->rear = NULL;return queue;
}int isEmpty(Queue* queue) {return (queue->front == NULL);
}void enqueue(Queue* queue, int data) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = NULL;if (isEmpty(queue)) {queue->front = newNode;queue->rear = newNode;} else {queue->rear->next = newNode;queue->rear = newNode;}
}int dequeue(Queue* queue) {if (isEmpty(queue)) {printf("Queue is empty. Unable to dequeue.\n");return -1; // 返回一个表示错误的特殊值}int data = queue->front->data;Node* temp = queue->front;if (queue->front == queue->rear) {queue->front = NULL;queue->rear = NULL;} else {queue->front = queue->front->next;}free(temp);return data;
}void traverse(Queue* queue) {if (isEmpty(queue)) {printf("Queue is empty. Nothing to traverse.\n");return;}printf("Queue traversal:\n\t\t");Node* current = queue->front;while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n");
}int main() {Queue* queue = createQueue();enqueue(queue, 5);enqueue(queue, 10);enqueue(queue, 3);traverse(queue);int data = dequeue(queue);printf("Dequeued data: %d\n", data);traverse(queue);return 0;
}
把 永 远 爱 你 写 进 诗 的 结 尾 ~
相关文章:
【数据结构与算法】03 队列(顺序队列--循环队列--优先级队列--链队列)
一、概念1.1 队列的基本概念1.2 队列的顺序存储结构1.21 顺序队列(静态队列)1.22 循环队列1.23 优先级队列 1.3 队列的链式存储结构 二、C语言实现2.1 顺序存储2.11 顺序队列2.12 循环队列2.13 优先级队列 2.2 链式存储 一、概念 1.1 队列的基本概念 队…...
【区块链 | L2】作为Layer2赛道的领跑者,如何理解 Arbitrum?
上周我们介绍了以太坊L2扩展解决方案Optimism,本周我们继续介绍另一个L2解决方案——Arbitrum。Arbitrum 是以太坊的一个 Optimistic Rollup L2 可扩展性解决方案。 Part.1 什么是Arbitrum? Arbitrum 是一个构建在以太坊之上的区块链网络。你可以使用 Arbitrum 链来做任何在…...
【协议】NVMe over RoCE |nvmeof
什么是nvme nvme ssd和普通ssd区别 ssd是固态硬盘,普通的ssd配的是SATA口(AHCI协议),nvme ssd配的是PCIe口(nvme传输协议) 相比普通SSD的SATA口,nvme的PCIe口有巨大的性能优势。 更多详情见&…...
硬件设计电源系列文章-DCDC转换器布局设计
文章目录 概要 整体架构流程 技术名词解释 1.开关电源PCB布局要点 2.输入电容的放置 3.二极管的放置 4.散热孔的放置 5.反馈路径的走线 小结 概要 提示:这里可以添加技术概要 例如: 本文主要DCDC转换器布局方面的知识。 整体架构流程 提示…...
「从入门到精通,一位设计师分享学习Illustrator的技巧和经验!」
学习Illustrator的个人笔记:从入门到精通 Adobe Illustrator是一款广泛使用的矢量图形软件,用于创建各种设计作品,如商标、海报、名片等。在本篇博客中,我将分享学习Illustrator的经验和技巧,帮助您更好地掌握这一工具…...
RedisGraph的整体架构
The architecture of RedisGraph 本文关注RedisGraph的整体架构,分别从图存储模型、索引、并发控制、和执行计划四个方面简要阐述。下图为RedisGraph的整体架构图。 1 图存储模型 了解一个图数据库的架构,最重要的就是其图存储模型,即其中的…...
C#可视化 家用轿车信息查询系统(具体做法及全部代码)
目录 题目: 效果图: 数据库: 做法: combobox值更新 查询按钮功能(非空验证,查询数据) datagirdview设置 全部代码: DBHelper类 From1主窗体代码 题目: 效果图&#…...
Nautilus Chain全球行分享会,上海站圆满举办
在北京时间 6 月 9 日,由 Nautilus Chain 主办的“Layer3 模块化区块链的发展探讨”为主题的全球行活动,在上海顺利举办,本次分享会联合主办方还包 括 Stanford Blockchain Accelerator、Zebec Protocol、Tiger VC DAO、Crypto PHD、Rootz La…...
day50_mybatis
今日内容 0 复习昨日 一、分页插件 二、ORM映射【重点】 三、多表联查 【重点】 四、动态SQL 【重点】 五、$和# 零、复习昨日 mybatis orm框架,作用于持久层,高效开发,只关注sql,其他不用关心 思考MyBatis到底帮你省了哪些事情? jdbc第四步sql自己编写之外,其他mybatis都做了…...
第十一届“创业江苏”科技创业大赛正式启动
为深入实施创新驱动战略, 推进高水平科技自立自强,强化企业创新主体地位,加速推动创新要素向企业集聚,促进科技和金融深度融合,优化科技创新创业生态,吸引优秀创业团队及企业到苏州创新发展,根据…...
EasyX实现简易贪吃蛇
📝个人主页:认真写博客的夏目浅石. 📣系列专栏:夏目的C语言宝藏 文章目录 前言一、头文件包含二、创建蛇与食物的结构体三、游戏的初始化四、游戏的绘画事件五、蛇的移动事件六、输入方向七、生成食物八、吃食物九、游戏失败的判定…...
Linux下ElasticSearch7.9.2安装配置(包含服务器配置、启动停止脚本、开放端口和elasticsearch-head插件的使用)
Linux下ElasticSearch7.9.2安装配置 前言1.下载安装1.1 使用wget的方式下载1.2 官网下载 2.上传到服务器并解压3.修改es配置文件3.1 es目录简介3.2 修改配置文件 4. 创建用户并赋权5. 服务器修改配置5.1 修改文件句柄数和线程数5.2 关闭swapping5.3 修改虚拟内存 6. 启动es6.1 …...
JS 之 事件Event对象详解(属性、方法、自定义事件)
一、Event对象 1、简介 事件event对象是指在浏览器中触发事件时,浏览器会自动创建一个event对象,其中存储了本次事件相关的信息,包括事件类型、事件目标、触发元素等等。浏览器创建完event对象之后,会自动将该对象作为参数传…...
65寸电视长宽多少厘米
65寸电视的长和宽分别是多少 65寸电视机尺寸是不确定的,要看电视的品牌和具体型号。一般来说,16:9屏幕比例下,65英寸电视的长宽分别为143.90厘米和80.94厘米。电视尺寸指的是电视屏幕对角线的长度,目前电视尺寸普遍以英…...
Python爬取影评并进行情感分析和数据可视化
Python爬取影评并进行情感分析和数据可视化 文章目录 Python爬取影评并进行情感分析和数据可视化一、引言二、使用requestsBeautifulSoup进行影评的爬取1、分析界面元素2、编写代码 三、情感分析1、数据预处理2、情感分析3、数据可视化 一、引言 前几天出了《航海王࿱…...
ubuntu22.04.2安装onlyoffice(不更改默认端口版)
目录 一、配置阿里源 二、postgresql数据库 (一)安装postgresql (二)创建postgresql数据库和用户 三、安装 rabbitmq 四、安装nginx-extras 五、安装ONLYOFFICE Docs (一)Add GPG key (…...
企业如何有效制定企业信息化发展规划?(附信息化模板)
如何有效制定企业信息化发展规划?企业信息化发展规划是一个宏大而又复杂的命题,这篇来掰开揉碎讲一下企业应该如何有效制定信息化发展规划。 这里不给大家灌鸡汤,也不给大家画大饼,就说些实在的。 如果你想找经验方法࿰…...
计算机网络填空题
我会写下自己的答案和理解 希望自己可用在学习中体会到快乐,而不是麻木。 1. 网络协议三要素中语义是指 需要发出何种控制信息,完成何种动作以及做出何种响应 1.在计算机网络中要做到有条不紊的交换数据,就必须遵守一些事…...
【HashMap】为什么用自定义的类做HashMap的Key时需要重写hashcode方法和equals方法
【HashMap】为什么用自定义的类做HashMap的Key时需要重写hashcode方法和equals方法 【一】为什么有这个问题【二】Object类的中的hashcode方法和equals方法【三】重写hashcode【四】重写equals方法【五】hashmap中使用hashcode和equals方法 【一】为什么有这个问题 因为HashMa…...
Flutter自定义对话框返回相关问题汇总
Flutter自定义对话框返回相关问题汇总,详细解释 Flutter是一款流行的移动应用开发框架,它提供了很多内置的对话框,但是有时候我们需要自定义对话框来满足特定需求。在使用自定义对话框时,可能会遇到一些问题,下面是一…...
002docker 安装
官网安装https://docs.docker.com/engine/install/ 系统要求 Centos7 Linux 内核:官方建议 3.10 以上查看Linux内核版本 用于打印当前系统的相关信息(内核版本号,硬件架构,主机名称和操作系统类型等 cat /proc/version uname -a 更新YUM源 生产环境中此步操作…...
软件工程师,全面思考问题很重要
为什么要全面思考问题 □ 在软件开发中,对一个问题思考得越全面,编写出的代码就会越严谨,出现bug的几率就越低;反之,如果没有对一个问题进行全面而深入的思考,编写出的代码就会漏洞百出,出现各种莫名其妙、无法复现的bug的几率也就急剧增加。 □ 软件就是数据加逻辑,数…...
1.Apollo部署-linux
一.官方文档 https://www.apolloconfig.com/#/zh/deployment/quick-start-docker 二.环境准备 1.MySql 5.6.51.单独服务器192.168.2.13 https://downloads.mysql.com/archives/installer/ 2.JDK 1.8.X https://www.oracle.com/java/technologies/downloads/ 三.Apollo部署…...
【HTML】form标签
<form> 标签用于创建 HTML 表单,它是用于收集用户输入的重要元素。表单可以包含各种输入字段、按钮和其他交互元素,用于向服务器发送用户输入数据。 下面是一个简单的 <form> 标签的示例: <form action"/submit-form&q…...
基于SPAD / SiPM技术的激光雷达方案
激光雷达(LiDAR)是一种测距技术,近年来越来越多地用于汽车先进驾驶辅助系统(ADAS)、手势识别和3D映射等应用。尤其在汽车领域,随着传感器融合的趋势,LiDAR结合成像、超声波、毫米波雷达,互为补足,为汽车提供全方位感知…...
使用MATLAB工具模拟单/双频GPS和载波相位差分GPS
第一部分:介绍和背景 在我们的日常生活中,全球定位系统(GPS)发挥了重要的作用。无论是在我们的手机中,还是在各种应用中,GPS都是实现精确位置定位的关键技术。然而,有时候我们可能需要对GPS进行…...
当社恐成为技术面试官
前言 在被不知道多少个面试官拒绝之后,毕业四年之际,我这个社恐也成为了一位面试官。至于社恐为什么能成为面试官,我想放到文末讲,感觉不是重点。 之前被面试,最讨厌的话就是:请简单介绍一下自己 我的内心…...
Jetpack Compose:使用PagerIndicator和Infinity实现滚动的HorizontalPager
Jetpack Compose:使用PagerIndicator和Infinity实现滚动的HorizontalPager 可能你已经知道,Jetpack Compose 默认不包含内置的ViewPager组件。然而,我们可以通过在 build.gradle 文件中添加 accompanist 库依赖,将 ViewPager 功能…...
2023年杭州/广州/东莞/深圳软考(中/高级)认证,618报名特惠
软考是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资格考试。 系统集成…...
springboot项目外卖管理 day03-公共字段填充与新增删除分类
文章目录 一、公共字段自动填充1.1、问题分析1.2、代码实现1.2.1、在实体类的属性上加入TableField注解,指定自动填充的策略1.2.2按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现MetaObjectHandler接口1.2.3 功能…...
h5网站制作价格/公司网站建设多少钱
1、渐变色彩 CSS3 Gradient 分为线性渐变(linear)和径向渐变(radial)。由于不同的渲染引擎实现渐变的语法不同,这里我们只针对线性渐变的 W3C 标准语法来分析其用法,其余大家可以查阅相关资料。W3C 语法已经得到了 IE10、Firefox19.0、Chrome26.0 和 Op…...
平板电脑可以做网站吗/seo搜索引擎优化怎么做
网络适配器中的microserof virtual wifi miniport adapter是windows7的隐藏功能,虚拟wifi。传统的临时无线网(即Ad Hoc模式)是一种点对点网络,类似于有线网中的“双机互联”,虽然也能实现互联网共享,但主要用于两个设备临时互联&a…...
网站建设发布平台/网站关键词优化费用
winhex镜像硬盘和ghost备份是完全不同的,ghost只能克隆或者镜像分区内正常的数据,删除的数据他是不会克隆的,所以在数据恢复应用中,ghost对我们来讲作用就不大了,而使用winhex备份(镜像)硬盘数据…...
四海网络网站建设咨询/网盘资源免费观看
原标题:「Linux基础知识」grep文件内容筛选命令的使用grep命令用于从文档中抓取显示包含指定字符的行,grep命令的使用格式如下:grep [选项] 匹配模式 文件1 文件2 ......grep常见的选项有:-n 显示匹配文档行的行号-i 忽略大小写按…...
网站优化月总结/就业seo好还是sem
一 PON基础知识 1.1 PON技术概念 PON(Passive Optical Network)即无源光网络,一种基于点到多点(P2MP)拓朴的技术。“无源”指ODN(光分配网络)不含有任何电子器件及电子电源,ODN全部由光分路器Splitter等无源器件组成,不需要贵重的有源电子设…...
wordpress 无广告视频插件下载/推广营销是什么
❑ 从 10.7.2 beta 11C6X 开始,启用 iCloud Find My Mac 功能,必须需要 Recovery HD 的存在。由于这个分区比较特殊,常规方法不能够创建它。导致很多同学为此,需要重装 OS X Lion。当然,重装是一个非常常规,…...