数据结构C语言描述5(图文结合)--队列,数组、链式、优先队列的实现

前言

  • 这个专栏将会用纯C实现常用的数据结构和简单的算法;
  • 有C基础即可跟着学习,代码均可运行;
  • 准备考研的也可跟着写,个人感觉,如果时间充裕,手写一遍比看书、刷题管用很多,这也是本人采用纯C语言实现的原因之一;
  • 欢迎收藏 + 关注,本人将会持续更新。

文章目录

    • 什么是队列
    • 队列基本操作
    • 队列的数组实现
    • 队列的链表实现
    • 双端队列
    • 优先队列简介

什么是队列

队列(Queue)也是一种运算受限的线性表,它限定在表的一端进行插入操作,在表的另一端进行删除操作。队列的结构特性是:先进先出FIFO ( First In First Out)。队列又被称为先进先出表。

队尾:允许插入的一端称作队尾(Rear)

队首:允许删除的一端称作队首(Front)

在这里插入图片描述

队列为空的时候 队头front和队尾tail都是0的位置,入队的时候队尾tail往后移动,出队的时候front往队列tail靠拢

因为front的移动,导致数组队列存在伪溢出现象,可以通过循环队列的方式解决伪溢出问题。

伪溢出:不是实际的的内存越界,只是队头下标比队尾下标前。

在这里插入图片描述

链式队列可以通过无表头链表记录头尾的方式实现,插入队列用表尾法插入,遍历表头法删除写法

队列基本操作

  • 创建栈
  • 入队
  • 出队
  • 获取队头元素
  • 队列是否为空
  • 队列元素个数

队列的数组实现

数组队列,就是数组模拟队列,实现方法有很多,这里也只是一种方法。

🚸队列封装

  • 数组队列实现是用过移动队头、队尾下标实现的,故核心在于front、tail的理解。
  • 数组采用扩容的方法存储数组。
typedef int DataType;
typedef struct Queue {
	DataType* data;
	int front, tail;
	int capacity;
}Queue;

🖍 创建队列(初始化)

这一步就是创建队列,为队列申请一块内存,并且初始化队列,注意,这里需要将tail赋值为-1 为什么呢? 这个可以随着看代码体会。

Queue* create_queue()
{
	Queue* queue = (Queue*)calloc(1, sizeof(Queue));
	assert(queue);
	queue->tail = -1;
	return queue;
}

🌓 入队

  • ++tail,采用后置++的方法从队尾巴插入,这里应该就能理解为什么要将tail赋值为-1
  • 注意:容量不够需要扩容。
void push(Queue* queue, DataType data)
{
	assert(queue);

	// 扩容
	if (queue->front == -1 || (queue->front >= queue->capacity)) {
		DataType* temp = (DataType*)realloc(queue->data, queue->capacity + 10);
		assert(temp);

		queue->data = temp;

		queue->capacity += 10;
	}

	queue->data[++queue->tail] = data;
}

✴️ 出队

  • 就是移动front,因为数组无法单独删除一个元素;
  • 注意:队列为空的情况,front>tail
void pop(Queue* queue)
{
	assert(queue);

	if (queue->front <= queue->tail) {
		queue->front++;
	}
}

🤕 获取对头元素

  • 这个就是通过数组下标直接获取即可。
DataType top(Queue* queue)
{
	assert(queue);

	return queue->data[queue->front];
}

🚄 万金油函数:队列大小、是否为空

  • 获取大小:注意获取的是大小,不是下标;
  • 判断是否为空:就是对头和队尾的下标对比。
int size(Queue* queue)
{
	assert(queue);

	return queue->tail + 1;
}

bool empty(Queue* queue)
{
	assert(queue);

	return queue->tail < queue->front;
}

⚗️ 总代码

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>

typedef int DataType;

typedef struct Queue {
	DataType* data;
	int front, tail;
	int capacity;
}Queue;

Queue* create_queue()
{
	Queue* queue = (Queue*)calloc(1, sizeof(Queue));
	assert(queue);
	queue->tail = -1;
	return queue;
}

void push(Queue* queue, DataType data)
{
	assert(queue);

	// 扩容
	if (queue->front == -1 || (queue->front >= queue->capacity)) {
		DataType* temp = (DataType*)realloc(queue->data, queue->capacity + 10);
		assert(temp);

		queue->data = temp;

		queue->capacity += 10;
	}

	queue->data[++queue->tail] = data;
}

DataType top(Queue* queue)
{
	assert(queue);

	return queue->data[queue->front];
}

void pop(Queue* queue)
{
	assert(queue);

	if (queue->front <= queue->tail) {
		queue->front++;
	}
}

int size(Queue* queue)
{
	assert(queue);

	return queue->tail + 1;
}

bool empty(Queue* queue)
{
	assert(queue);

	return queue->tail < queue->front;
}

int main()
{
	Queue* queue = create_queue();

	for (int i = 1; i <= 10; i++) {
		push(queue, i);
	}

	while (!empty(queue)) {
		printf("%d ", top(queue));
		pop(queue);
	}

	return 0;
}

队列的链表实现

链表这里采用的是无头单链表实现,其中:

  • 入栈:插入队头
  • 出栈:弹出队头

🌛 队列封装

这个部分就是正常的节点封装,队列封装。

// 无头链表,封装写法,尾插法

typedef int DataType;

typedef struct Node {
	DataType* data;
	struct Node* next;
}Node;

typedef struct Queue {
	Node* queueHead;
	// Node* tailHead;     // 添加这个节点会更简单一点
	int size;
}Queue;

👤 创建队列(初始化)

这一部分也是正常的创建节点、队列,然后申请内存。

Node* create_node(DataType data)
{
	Node* node = (Node*)calloc(1, sizeof(Node));
	assert(node);
	node->data = data;
	return node;
}

Queue* create_queue()
{
	Queue* queue = (Queue*)calloc(1, sizeof(Queue));
	assert(queue);
	return queue;
}

📌 入队

入队就是在链表头插入,但是要注意,再插入的时候需要判断是否为空表:

  • 空表:插入节点作为头;
  • 不为空,则头插。
void push(Queue* queue, DataType data)
{
	assert(queue);

	if (queue->size == 0) {
		queue->queueHead = create_node(data);
	}
	else {
		Node* temp = queue->queueHead;
		while (temp->next) {
			temp = temp->next;
		}
		temp->next = create_node(data);
	}
	queue->size++;
}

🏤 出队

出队就是弹出头节点,但是要注意提前判断链表是否为空的情况。

void pop(Queue* queue)
{
	assert(queue);
	if (queue->size == 0) {
		return;
	}

	Node* temp = queue->queueHead;
	queue->queueHead = temp->next;
	free(temp);
	temp = NULL;

	queue->size--;
}

🍿 获取对头元素

这个就是获取头节点的元素值,要注意的是空表的情况,这里空表是直接断言了。

DataType top(Queue* queue)
{
	assert(queue);
	assert(queue->size != 0);   // 队列为空,不能获取栈顶元素
	
	return queue->queueHead->data;
}

🔌 万金油函数:队列大小、是否为空

这个没有什么好说的,看代码吧。

bool empty(Queue* queue)
{
	assert(queue);

	return queue->size == 0;
}

int size(Queue* queue)
{
	assert(queue);

	return queue->size;
}

总代码

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <assert.h>

// 无头链表,封装写法,尾插法

typedef int DataType;

typedef struct Node {
	DataType* data;
	struct Node* next;
}Node;

typedef struct Queue {
	Node* queueHead;
	// Node* tailHead;     // 添加这个节点会更简单一点
	int size;
}Queue;

Node* create_node(DataType data)
{
	Node* node = (Node*)calloc(1, sizeof(Node));
	assert(node);
	node->data = data;
	return node;
}

Queue* create_queue()
{
	Queue* queue = (Queue*)calloc(1, sizeof(Queue));
	assert(queue);
	return queue;
}

void push(Queue* queue, DataType data)
{
	assert(queue);

	if (queue->size == 0) {
		queue->queueHead = create_node(data);
	}
	else {
		Node* temp = queue->queueHead;
		while (temp->next) {
			temp = temp->next;
		}
		temp->next = create_node(data);
	}
	queue->size++;
}

DataType top(Queue* queue)
{
	assert(queue);
	assert(queue->size != 0);   // 队列为空,不能获取栈顶元素
	
	return queue->queueHead->data;
}

void pop(Queue* queue)
{
	assert(queue);
	if (queue->size == 0) {
		return;
	}

	Node* temp = queue->queueHead;
	queue->queueHead = temp->next;
	free(temp);
	temp = NULL;

	queue->size--;
}

bool empty(Queue* queue)
{
	assert(queue);

	return queue->size == 0;
}

int size(Queue* queue)
{
	assert(queue);

	return queue->size;
}

int main()
{
	Queue* queue = create_queue();

	for (int i = 1; i <= 10; i++) {
		push(queue, i);
	}

	while (!empty(queue)) {
		printf("%d ", top(queue));
		pop(queue);
	}

	return 0;
}

双端队列

双端队列(Deque)是一种具有队列和栈性质的数据结构,它允许我们从两端添加或删除元素。这种灵活性使得双端队列在多种场景下都非常有用。

双端队列支持的基本操作包括

  • 入队:在队列的前端或后端添加元素。
  • 出队:从队列的前端或后端移除元素。
  • 访问:访问队列的前端或后端元素而不移除它们。

🉑 实现

  • 采用无头双向链表实现

📦 节点封装

这个就是封装数据节点,双向链表节点,和之前一样,代码如下:

typedef int DataType;

typedef	struct Node {
	DataType data;
	struct Node* prev;
	struct Node* next;
}Node;

typedef struct Deque {
	Node* head;
	Node* tail;
	int count;
}Deque;

📇 初始化节点

这个也是和上面一样,封装创建节点、创建队列的节点。

Node* create_node(DataType data)
{
	Node* node = (Node*)calloc(1, sizeof(Node));
	assert(node);
	node->data = data;
	return node;
}

Deque* create_deque()
{
	Deque* deque = (Deque*)calloc(1, sizeof(Deque));
	assert(deque);
	return deque;
}

🎧 头插

头插这个要注意的就是判断链表是否为空。

void push_front(Deque* deque, DataType data)
{
	assert(deque);

	if (deque->count == 0) {
		deque->head = deque->tail = create_node(data);
	}
	else {
		Node* node = create_node(data);
		node->next = deque->head;
		deque->head->prev = node;
		deque->head = node;
	}
	deque->count++;
}

🎉 尾插

尾插这个也是要注意的就是判断链表是否为空。

void push_back(Deque* deque, DataType data)
{
	assert(deque);

	if (deque->count == 0) {
		deque->head = deque->tail = create_node(data);
	}
	else {
		Node* node = create_node(data);
		node->prev = deque->tail;
		deque->tail->next = node;
		deque->tail = node;
	}
	deque->count++;
}

👟 头删

删除要注意几个点:

  • 空不能删;
  • 删除后,如果是一个节点删除,则要将指向尾节点指针赋值为NULL,如果不是,则需要将新的对头元素前指针赋值为NULL。
void pop_front(Deque* deque)
{
	assert(deque);
	assert(deque->count != 0);   // 空,不能弹出

	Node* temp = deque->head;
	deque->head = temp->next;
	free(temp);
	temp = NULL;

	(deque->head) ? (deque->head->prev = NULL) : (deque->tail = NULL);   // 这个写法

	deque->count--;
}

🚖 尾删

删除要注意几个点:

  • 空不能删;
  • 删除后,如果是一个节点删除,则要将指向头节点指针赋值为NULL,如果不是,则需要将新队尾的下一个指针赋值为NULL。
void pop_tail(Deque* deque)
{
	assert(deque);
	assert(deque->count != 0);

	Node* temp = deque->tail;
	deque->tail = temp->prev;

	(deque->tail) ? (deque->tail->next = NULL) : (deque->head = NULL);

	free(temp);
	temp = NULL;

	deque->count--;
}

📑 获取对头、队尾大小

这个就是获取对于节点的元素值,但是要注意的是没有元素的情况。

DataType top_front(Deque* deque)
{
	assert(deque);
	assert(deque->count != 0);
	return deque->head->data;
}

DataType top_tail(Deque* deque)
{
	assert(deque);
	assert(deque->count != 0);

	return deque->tail->data;
}


🆎 总代码

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <assert.h>

/*
C++: deque
实现:双向链表
*/

typedef int DataType;

typedef	struct Node {
	DataType data;
	struct Node* prev;
	struct Node* next;
}Node;

typedef struct Deque {
	Node* head;
	Node* tail;
	int count;
}Deque;

Node* create_node(DataType data)
{
	Node* node = (Node*)calloc(1, sizeof(Node));
	assert(node);
	node->data = data;
	return node;
}

Deque* create_deque()
{
	Deque* deque = (Deque*)calloc(1, sizeof(Deque));
	assert(deque);
	return deque;
}

void push_back(Deque* deque, DataType data)
{
	assert(deque);

	if (deque->count == 0) {
		deque->head = deque->tail = create_node(data);
	}
	else {
		Node* node = create_node(data);
		node->prev = deque->tail;
		deque->tail->next = node;
		deque->tail = node;
	}
	deque->count++;
}

void push_front(Deque* deque, DataType data)
{
	assert(deque);

	if (deque->count == 0) {
		deque->head = deque->tail = create_node(data);
	}
	else {
		Node* node = create_node(data);
		node->next = deque->head;
		deque->head->prev = node;
		deque->head = node;
	}
	deque->count++;
}

// 简单代码的思路,记住
void pop_front(Deque* deque)
{
	assert(deque);
	assert(deque->count != 0);   // 空,不能弹出

	Node* temp = deque->head;
	deque->head = temp->next;
	free(temp);
	temp = NULL;

	(deque->head) ? (deque->head->prev = NULL) : (deque->tail = NULL);   // 这个写法

	deque->count--;
}

void pop_tail(Deque* deque)
{
	assert(deque);
	assert(deque->count != 0);

	Node* temp = deque->tail;
	deque->tail = temp->prev;

	(deque->tail) ? (deque->tail->next = NULL) : (deque->head = NULL);

	free(temp);
	temp = NULL;

	deque->count--;
}

DataType top_front(Deque* deque)
{
	assert(deque);
	assert(deque->count != 0);
	return deque->head->data;
}

DataType top_tail(Deque* deque)
{
	assert(deque);
	assert(deque->count != 0);

	return deque->tail->data;
}

void print_deque(Deque* deque)
{
	assert(deque);

	Node* temp = deque->head;

	while (temp != NULL) {
		printf("%d ", temp->data);
		temp = temp->next;
	}
	printf("\n");
}

int main()
{
	Deque* deque = create_deque();

	for (int i = 1; i <= 10; i++) {
		push_front(deque, i);
	}

	print_deque(deque);

	for (int i = 20; i <= 30; i++) {
		push_back(deque, i);
	}

	print_deque(deque);

	pop_front(deque);
	pop_tail(deque);

	print_deque(deque);

	return 0;
}

优先队列简介

优先队列,我们第一反应是,没错,应该是应用最广泛的优先队列,但是从优先队列的定义来看,堆也只是其一种实现方式,优先队列的定义是:按照权值出队。

这里实现了一个简单的优先队列,出队的时候按照优先权最高出队,代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>

// 优先队列,按照权值出队,这里只是实现一个简易版本
#define MAX 100

typedef struct Data {
	int key;    // 比较准则
	char name[20];
}Data;

typedef struct PriQueue {
	Data data[MAX];    // 简单版本,不扩容
	int curSize;
}PriQueue;

PriQueue* create_priqueue()
{
	PriQueue* queue = (PriQueue*)calloc(1, sizeof(PriQueue));
	assert(queue);
	queue->curSize = -1;  /// 头为 -1
	return queue;
}

bool empty(PriQueue* queue)
{
	assert(queue);

	return queue->curSize == -1;
}

size_t size(PriQueue* queue)
{
	assert(queue);

	return queue->curSize + 1;
}

void push(PriQueue* queue, Data data)
{
	assert(queue);
	if (queue->curSize == MAX)
		return;

	queue->data[++queue->curSize] = data;
}

// 这里规定:权重最大的优先权最高,故弹出优先权最大的
void pop(PriQueue* queue, Data* temp)   // temp:存储需弹出的元素
{
	assert(queue);

	Data t = queue->data[0];
	int max = 0;
	for (int i = 1; i <= queue->curSize; i++) {
		if (queue->data[i].key > t.key) {
			t = queue->data[i];
			max = i;
		}
	}
	// 存储
	*temp = queue->data[max];

	for (int i = max; i <= queue->curSize - 1; i++) {
		queue->data[i] = queue->data[i + 1];
	}

	queue->curSize--;
}

int main()
{
	PriQueue* queue = create_priqueue();

	Data arr[5] = { {1,"小美"},{5,"小丽"},{3,"小芳"},{4,"coco"},{2,"花花"} };

	for (int i = 0; i < 5; i++) {
		push(queue, arr[i]);
	}

	while (!empty(queue)) {
		Data temp;
		pop(queue, &temp);
		printf("key: %d, value: %s\n", temp.key, temp.name);
	}

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/924041.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ADS9-V2EBZ 评估板

ADS9-V2EBZ 评估板 概览 优势和特点 Xilinx Kintex Ultrascale XCKU15P-2FFVE1517E FPGA。 1 个 FMC 连接器。 20 个 28 Gbps 收发器&#xff0c;由一 (1) 个 FMC 连接器提供支持 HMC DRAM 简单 USB 3.0 端口接口。 随附两张微型 SD 卡&#xff0c;“TRX”用于 ADRV9026 评估…

深入探讨 Redis 持久化机制:原理、配置与优化策略

文章目录 一、引言二、Redis持久化概述三、RDB&#xff08;Redis DataBase&#xff09;持久化1、RDB概念与工作原理2、RDB的配置选项3、RDB优化配置项4、RDB的优势与劣势 三、AOF&#xff08;Append-Only File&#xff09;持久化1、AOF概念与工作原理2、AOF的三种写回策略3、Re…

【回文数组——另类递推】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int N 1e510; int a[N], b[N]; int main() {int n;cin >> n;for(int i 1; i < n; i)cin >> a[i];for(int i 1; i < n / 2; i)b[i] a[i] - a[n1-i];ll ans 0;…

scala统计词频

package test23import java.io.PrintWriter import scala.io.Source object test {def main(args: Array[String]): Unit {//从文件1.txt中&#xff0c;读取内容val content Source.fromFile("1.txt").mkStringprintln(content)//把字符串中的每个单词&#xff0c;…

数据结构——排序算法第二幕(交换排序:冒泡排序、快速排序(三种版本) 归并排序:归并排序(分治))超详细!!!!

文章目录 前言一、交换排序1.1 冒泡排序1.2 快速排序1.2.1 hoare版本 快排1.2.2 挖坑法 快排1.2.3 lomuto前后指针 快排 二、归并排序总结 前言 继上篇学习了排序的前面两个部分:直接插入排序和选择排序 今天我们来学习排序中常用的交换排序以及非常稳定的归并排序 快排可是有多…

Android基本概念及控件

Android是Google公司基于Linux平台开发的主要应用于智能手机及平板电脑的操作系统。 ART模式与Dalvik模式最大的不同在于:在启用ART模式后&#xff0c;系统在安装应用程序的时候会进行一次预编译&#xff0c;并先将代码转换为机器语言存储在本地,这样在运行程序时就不会每次都…

【JavaEE初阶 — 网络编程】Socket 套接字 & UDP数据报套接字编程

1. Socket套接字 1.1 概念 Socket 套接字&#xff0c;是由系统提供用于网络通信的技术&#xff0c;是基于TCP / IP协议的网络通信的基本操作单元。基于 Socket 套接字的网络程序开发就是网络编程。 1.2 分类 Socket套接字主要针对传输层协议划分为如下三类&#x…

Leecode刷题C语言之交替组②

执行结果:通过 执行用时和内存消耗如下&#xff1a; 代码如下&#xff1a; int numberOfAlternatingGroups(int* colors, int colorsSize, int k) {int res 0, cnt 1;for (int i -k 2; i < colorsSize; i) {if (colors[(i colorsSize) % colorsSize] ! colors[(i - …

科技惊艳:RFID技术引领被装物联网信息化革新

被装物联网信息化监控系统是一项错综复杂却成效斐然的解决方案&#xff0c;它巧妙地将物联网技术的先进性与装设备资源管理的实际需求相融合&#xff0c;实现了对被装设备资源的即时追踪、智能化调控以及资源的最优化配置。以下是对被装物联网的深度剖析与高端解读&#xff1a;…

360推出全新的生成式 AI 搜索产品:纳米搜索,要重塑搜索产品

【大力财经】直击互联网最前线&#xff1a;360 集团在 2024 年 11 月 27 日开发布会&#xff0c;重磅推出了一款全新的生成式 AI 搜索产品——纳米搜索&#xff0c;并且已经上架到苹果 App Store 以及应用宝等安卓应用商店&#xff0c;直接与百度、阿里夸克、秘塔 AI、Perplexi…

Android Deep Links 深度链接解析

在实现 Android 应用链接之前&#xff0c;请务必了解您可以在 Android 应用中创建的不同类型的链接&#xff1a;深层链接、网页链接和 Android 应用链接。 Android Deep Links 深度链接解析 一、什么是Deep Links&#xff1f;二、Deep Links的优势三、Deep Links的实现方式1. …

setter方法注入(Java EE 学习笔记07)

属性setter方法注入是Spring最主流的注入方法&#xff0c;这种注入方法简单、直观&#xff0c;它是在被注入的类中声明一个setter方法&#xff0c;通过setter方法的参数注入对应的值。 案例&#xff1a; ① 创建User2实体&#xff0c;配置setter方法 package com.lq.entities…

英语知识网站:Spring Boot技术构建

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

2025蓝桥杯(单片机)备赛--扩展外设之UART1的原理与应用(十二)

一、串口1的实现原理 a.查看STC15F2K60S2数据手册: 串口一在590页&#xff0c;此款单片机有两个串口。 串口1相关寄存器&#xff1a; SCON:串行控制寄存器&#xff08;可位寻址&#xff09; SCON寄存器说明&#xff1a; 需要PCON寄存器的SMOD0/PCON.6为0&#xff0c;使SM0和SM…

利用Python爬取12306网站车次信息

前言 随着互联网技术的发展,网络爬虫成为了获取公开数据的强大工具之一。对于经常需要查询火车票信息的人来说,能够自己编写一个爬虫程序来自动获取并整理这些信息,无疑是一个非常实用的技能。本文将详细介绍如何使用Python爬取12306网站上的车次信息,包括获取站点对应城市…

React Hooks中use的细节

文档 useState useState如果是以函数作为参数&#xff0c;那要求是一个纯函数&#xff0c;不接受任何参数&#xff0c;同时需要一个任意类型的返回值作为初始值。 useState可以传入任何类型的参数作为初始值&#xff0c;当以一个函数作为参数进行传入的时候需要注意&#xff…

2024 TIP 论文 robust-ref-seg 复现过程

本篇是 2024 年 TIP 论文 Toward Robust Referring Image Segmentation 的复现过程。 特点是对不存在的目标不会进行错误分割&#xff0c;鲁棒性较高&#xff0c;其结果如图&#xff1a; 配置环境 根据论文给出的链接 robust-ref-seg 配置环境。 下载数据集 按照 README 指…

数据结构(初阶6)---二叉树(遍历——递归的艺术)(详解)

二叉树的遍历与练习 一.二叉树的基本遍历形式1.前序遍历(深度优先遍历)2.中序遍历(深度优先遍历)3.后序遍历(深度优先遍历)4.层序遍历&#xff01;&#xff01;(广度优先遍历) 二.二叉树的leetcode小练习1.判断平衡二叉树1&#xff09;正常解法2&#xff09;优化解法 2.对称二叉…

k8s集群增加nfs-subdir-external-provisioner存储类

文章目录 前言一、版本信息二、本机安装nfs组件包三、下载nfs-subdir-external-provisioner配置文件并进行配置1.下载文件2.修改配置 三、进行部署备注&#xff1a;关于镜像无法拉取问题的处理 前言 手里的一台服务器搭建一个单点的k8s集群&#xff0c;然后在本机上使用nfs-su…

C++ For Hot100

数组&#xff1a;数组是存放在连续内存空间上的相同类型数据的集合。 1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> v;for(int i 0;i<nums.size…