当前位置: 首页 > news >正文

【蓝桥杯】常见的数据结构

🌸个人主页:Yang-ai-cao

📕系列专栏:蓝桥杯    C语言

   🍍博学而日参省乎己,知明而行无过矣


目录

🌸个人主页:Yang-ai-cao

📕系列专栏:蓝桥杯    C语言

   🍍博学而日参省乎己,知明而行无过矣

一、 数组(Array)

1、定义和初始化数组是一种线性数据结构,用于存储固定大小的相同类型元素。

2、访问和修改元素

3、常见操作

- 遍历数组

- 查找元素

线性查找

二分查找(适用于有序数组)

- 排序数组(如冒泡排序、快速排序等)

冒泡排序

快速排序

二、 链表(Linked List)

1、定义节点结构链表是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。

2、创建和初始化链表

常见操作

- 插入节点(在头部、尾部或中间插入)

在头部插入节点

在尾部插入节点

在中间插入节点(在指定位置后插入)

- 删除节点(删除指定值的节点或指定位置的节点)

删除指定值的节点

删除指定位置的节点

- 遍历链表

四、总结


在蓝桥杯竞赛中,C语言是常用的编程语言之一。参赛者需要掌握一些常见的数据结构,以便高效地解决竞赛中的问题。以下是C语言中常见的几种数据结构及其基本操作的介绍。

一、 数组(Array)

1、定义和初始化
数组是一种线性数据结构,用于存储固定大小的相同类型元素。

// 定义和初始化一个整型数组
int arr[5] = {1, 2, 3, 4, 5};// 动态分配数组
int *arr = (int *)malloc(5 * sizeof(int));

2、访问和修改元素

// 访问数组元素
int value = arr[2]; // 获取第三个元素// 修改数组元素
arr[2] = 10; // 将第三个元素修改为10

3、常见操作


- 遍历数组
#include <stdio.h>void traverseArray(int arr[], int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() {int arr[] = {1, 2, 3, 4, 5};int size = sizeof(arr) / sizeof(arr[0]);traverseArray(arr, size);return 0;
}

- 查找元素
线性查找
#include <stdio.h>int linearSearch(int arr[], int size, int target) {for (int i = 0; i < size; i++) {if (arr[i] == target) {return i; // 返回目标元素的索引}}return -1; // 没有找到目标元素
}int main() {int arr[] = {1, 2, 3, 4, 5};int size = sizeof(arr) / sizeof(arr[0]);int target = 3;int result = linearSearch(arr, size, target);if (result != -1) {printf("Element found at index %d\n", result);} else {printf("Element not found\n");}return 0;
}
二分查找(适用于有序数组)
#include <stdio.h>int binarySearch(int arr[], int size, int target) {int left = 0, right = size - 1;while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid; // 找到目标元素}if (arr[mid] < target) {left = mid + 1; // 向右半部分查找} else {right = mid - 1; // 向左半部分查找}}return -1; // 没有找到目标元素
}int main() {int arr[] = {1, 2, 3, 4, 5};int size = sizeof(arr) / sizeof(arr[0]);int target = 3;int result = binarySearch(arr, size, target);if (result != -1) {printf("Element found at index %d\n", result);} else {printf("Element not found\n");}return 0;
}
- 排序数组(如冒泡排序、快速排序等)
冒泡排序
#include <stdio.h>void bubbleSort(int arr[], int size) {for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 交换元素int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}int main() {int arr[] = {5, 2, 9, 1, 5, 6};int size = sizeof(arr) / sizeof(arr[0]);bubbleSort(arr, size);for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}
快速排序
#include <stdio.h>void swap(int* a, int* b) {int temp = *a;*a = *b;*b = temp;
}int partition(int arr[], int low, int high) {int pivot = arr[high]; // 选择最后一个元素作为枢轴int i = (low - 1); // 较小元素的索引for (int j = low; j <= high - 1; j++) {// 如果当前元素小于或等于枢轴if (arr[j] <= pivot) {i++; // 增加较小元素的索引swap(&arr[i], &arr[j]);}}swap(&arr[i + 1], &arr[high]);return (i + 1);
}void quickSort(int arr[], int low, int high) {if (low < high) {int pi = partition(arr, low, high);// 分别对枢轴元素左右两部分进行快速排序quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);}
}int main() {int arr[] = {10, 7, 8, 9, 1, 5};int size = sizeof(arr) / sizeof(arr[0]);quickSort(arr, 0, size - 1);for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

二、 链表(Linked List)

1、定义节点结构
链表是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。

// 定义链表节点结构
struct Node {int data;struct Node *next;
};

2、创建和初始化链表

// 创建一个新节点
struct Node* createNode(int data) {struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));newNode->data = data;newNode->next = NULL;return newNode;
}
// 初始化链表
struct Node* head = createNode(1);
head->next = createNode(2);
head->next->next = createNode(3);

常见操作


- 插入节点(在头部、尾部或中间插入)
在头部插入节点
void insertAtHead(struct Node** head, int data) {struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));newNode->data = data;newNode->next = *head;*head = newNode;
}
在尾部插入节点
void insertAtTail(struct Node** head, int data) {struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));newNode->data = data;newNode->next = NULL;if (*head == NULL) {*head = newNode;return;}struct Node* temp = *head;while (temp->next != NULL) {temp = temp->next;}temp->next = newNode;
}
在中间插入节点(在指定位置后插入)
void insertAfter(struct Node* prevNode, int data) {if (prevNode == NULL) {printf("Previous node cannot be NULL\n");return;}struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));newNode->data = data;newNode->next = prevNode->next;prevNode->next = newNode;
}
- 删除节点(删除指定值的节点或指定位置的节点)
删除指定值的节点
void deleteNodeByValue(struct Node** head, int key) {struct Node* temp = *head;struct Node* prev = NULL;// 如果头节点就是要删除的节点if (temp != NULL && temp->data == key) {*head = temp->next; // 改变头节点free(temp); // 释放旧头节点return;}// 搜索要删除的节点,保持前一个节点的指针while (temp != NULL && temp->data != key) {prev = temp;temp = temp->next;}// 如果没有找到要删除的节点if (temp == NULL) return;// 解除节点链接prev->next = temp->next;free(temp); // 释放内存
}
删除指定位置的节点
void deleteNodeByPosition(struct Node** head, int position) {if (*head == NULL) return;struct Node* temp = *head;// 如果头节点需要被删除if (position == 0) {*head = temp->next; // 改变头节点free(temp); // 释放旧头节点return;}// 找到要删除的节点的前一个节点for (int i = 0; temp != NULL && i < position - 1; i++) {temp = temp->next;}// 如果位置超过链表长度if (temp == NULL || temp->next == NULL) return;// 节点temp->next是要删除的节点struct Node* next = temp->next->next;free(temp->next); // 释放内存temp->next = next; // 解除节点链接
}
- 遍历链表
void traverseList(struct Node* head) {struct Node* temp = head;while (temp != NULL) {printf("%d -> ", temp->data);temp = temp->next;}printf("NULL\n");
}

三、栈(Stack)

1、定义和初始化
栈是一种后进先出(LIFO)的数据结构,可使用数组或链表实现。

// 使用数组实现栈
#define MAX 100struct Stack {int top;int items[MAX];
};// 初始化栈
void initStack(struct Stack* s) {s->top = -1;
}// 检查栈是否为空
int isEmpty(struct Stack* s) {return s->top == -1;
}// 检查栈是否满
int isFull(struct Stack* s) {return s->top == MAX - 1;
}

2、 常见操作


- 压栈(Push)
void push(struct Stack* s, int item) {if (isFull(s)) {printf("Stack is full\n");return;}s->items[++s->top] = item;
}
- 弹栈(Pop)
int pop(struct Stack* s) {if (isEmpty(s)) {printf("Stack is empty\n");return -1;}return s->items[s->top--];
}
- 获取栈顶元素(Peek)
int peek(struct Stack* s) {if (isEmpty(s)) {printf("Stack is empty\n");return -1;}return s->items[s->top];
}

四、 队列(Queue)

1、定义和初始化
队列是一种先进先出(FIFO)的数据结构,可使用数组或链表实现。

// 使用数组实现队列
#define MAX 100struct Queue {int front, rear, size;int items[MAX];
};// 初始化队列
void initQueue(struct Queue* q) {q->front = 0;q->rear = MAX - 1;q->size = 0;
}// 检查队列是否为空
int isEmpty(struct Queue* q) {return q->size == 0;
}// 检查队列是否满
int isFull(struct Queue* q) {return q->size == MAX;
}

2、常见操作


- 入队(Enqueue)
void enqueue(struct Queue* q, int item) {if (isFull(q)) {printf("Queue is full\n");return;}q->rear = (q->rear + 1) % MAX;q->items[q->rear] = item;q->size++;
}
- 出队(Dequeue)
int dequeue(struct Queue* q) {if (isEmpty(q)) {printf("Queue is empty\n");return -1;}int item = q->items[q->front];q->front = (q->front + 1) % MAX;q->size--;return item;
}
- 获取队首元素(Front)
int front(struct Queue* q) {if (isEmpty(q)) {printf("Queue is empty\n");return -1;}return q->items[q->front];
}

五、树 (Tree)

树是一种分层数据结构,由节点(Node)组成,每个节点包含一个值和指向子节点的指针。最常见的树类型是二叉树(Binary Tree),其中每个节点最多有两个子节点。

1、二叉树节点结构定义
#include <stdio.h>
#include <stdlib.h>// 定义二叉树节点结构
struct TreeNode {int data;struct TreeNode* left;struct TreeNode* right;
};
2、插入节点

  二叉搜索树(Binary Search Tree, BST) 的插入函数为例。二叉搜索树是一种特殊的二叉树,其中每个节点的左子树包含的节点值都小于该节点的值,而右子树包含的节点值都大于该节点的值。

插入节点的过程

  1. 检查根节点是否为空
    • 如果根节点为空,创建一个新的节点并将其作为根节点返回。
  2. 比较插入值与当前节点值
    • 如果插入值小于当前节点值,递归地在左子树中插入该值。
    • 如果插入值大于当前节点值,递归地在右子树中插入该值。
// 插入节点函数
struct TreeNode* insertNode(struct TreeNode* root, int data) {if (root == NULL) {struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));newNode->data = data;newNode->left = newNode->right = NULL;return newNode;}if (data < root->data) {root->left = insertNode(root->left, data);} else {root->right = insertNode(root->right, data);}return root;
}
3、遍历二叉树
// 中序遍历函数
void inorderTraversal(struct TreeNode* root) {if (root != NULL) {inorderTraversal(root->left);printf("%d ", root->data);inorderTraversal(root->right);}
}

六、图 (Graph)

图是一种非线性数据结构,由节点(顶点)和连接这些节点的边组成。图可以是有向的(Directed)或无向的(Undirected)。

邻接矩阵表示图

#include <stdio.h>
#include <stdlib.h>#define MAX_VERTICES 5// 添加边的函数
void addEdge(int graph[MAX_VERTICES][MAX_VERTICES], int u, int v) {graph[u][v] = 1;graph[v][u] = 1; // 如果是无向图
}// 打印图的函数
void printGraph(int graph[MAX_VERTICES][MAX_VERTICES]) {for (int i = 0; i < MAX_VERTICES; i++) {for (int j = 0; j < MAX_VERTICES; j++) {printf("%d ", graph[i][j]);}printf("\n");}
}int main() {int graph[MAX_VERTICES][MAX_VERTICES] = {0};addEdge(graph, 0, 1);addEdge(graph, 0, 4);addEdge(graph, 1, 2);addEdge(graph, 1, 3);addEdge(graph, 1, 4);addEdge(graph, 2, 3);addEdge(graph, 3, 4);printGraph(graph);return 0;
}

七、哈希表 (Hash Table)

哈希表是一种用于快速查找的数据结构,通过哈希函数将键映射到数组中的位置。

1、哈希表节点结构定义

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define TABLE_SIZE 10// 定义哈希表节点结构
struct HashNode {int key;int value;struct HashNode* next;
};// 定义哈希表结构
struct HashTable {struct HashNode* table[TABLE_SIZE];
};

2、哈希函数

// 哈希函数
int hashFunction(int key) {return key % TABLE_SIZE;
}

3、插入键值对

// 插入键值对的函数
void insert(struct HashTable* hashTable, int key, int value) {int hashIndex = hashFunction(key);struct HashNode* newNode = (struct HashNode*)malloc(sizeof(struct HashNode));newNode->key = key;newNode->value = value;newNode->next = hashTable->table[hashIndex];hashTable->table[hashIndex] = newNode;
}

4、查找键值对

// 查找键值对的函数
int search(struct HashTable* hashTable, int key) {int hashIndex = hashFunction(key);struct HashNode* node = hashTable->table[hashIndex];while (node != NULL) {if (node->key == key) {return node->value;}node = node->next;}return -1; // 未找到键
}

总结

     掌握这些常见的数据结构及其基本操作是参加蓝桥杯竞赛的基础。通过练习和理解这些数据结构,咱将能够更高效地解决竞赛中的各种编程问题。希望这些介绍对你有所帮助!如果你有任何具体问题或需要进一步的帮助,请随时告诉我。

相关文章:

【蓝桥杯】常见的数据结构

&#x1f338;个人主页&#xff1a;Yang-ai-cao &#x1f4d5;系列专栏&#xff1a;蓝桥杯 C语言 &#x1f34d;博学而日参省乎己&#xff0c;知明而行无过矣 目录 &#x1f338;个人主页&#xff1a;Yang-ai-cao &#x1f4d5;系列专栏&#xff1a;蓝桥杯 C语言 &…...

STM32H750外设ADC之外部触发和注入管理

目录 概述 1 外部触发转换和触发极性 1.1 外部触发条件 1.2 忽略硬件触发条件 1.3 触发框图 1.4 常规通道的外部触发 1.5 注入通道的外部触发 2 注入通道管理 2.1 触发注入模式 2.2 自动注入模式 2.3 注入转换延迟 概述 本文主要介绍STM32H750外设ADC之外部触发和注…...

软设之排序算法对比

直接插入 时间复杂度:平均情况为O(n^2)。特殊情况下基本有序最优为O(n) 空间复杂度:O(1) 希尔排序 时间复杂度:平均情况O(n^1.3) 空间复杂度:O(1) 直接选择排序 时间复杂度:O(n^2) 空间复杂度:O(1) 堆排序 时间复杂度:O(nlog(2)n) 空间复杂度:O(1) 冒泡排序 时间…...

javascript导入excel文件

导入文件用到一个 xlsx.core.js 的包。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><script type"tex…...

「C系列」C 变量及常见问题梳理

文章目录 一、C 变量1. 整数变量2. 浮点数变量3. 字符变量4. 字符串变量&#xff08;在C中&#xff0c;通常使用字符数组来表示字符串&#xff09; 二、C 变量-常见问题1. 变量未初始化2. 变量类型不匹配3. 变量作用域问题4. 变量命名冲突5. 变量越界访问6. 变量声明位置7. 变量…...

<网络安全VIP>第二篇《工业控制软件》

1 PLC PLC,(Programmable Logic Controller),可编程逻辑控制器(PLC)是种专门为在工业环境下应用而设计的数字运算操作电子系统。 2 DCS 四、DCS的发展趋势 一、DCS的基本定义 DCS是分布式控制系统(Distributed Control System)的英文缩写,在国内自控行业又称之为集…...

微服务:Rabbitmq中的不同交换机的使用Fanout、Direct、Topic(消息队列中间件)

文章目录 发布订阅Fanout 交换机Direct 交换机Topic 交换机通配符规则 发布订阅 在这里插入图片描述 Fanout 交换机 Fanout 交换机会将收到的消息路由到每一个跟其绑定的queue上。 我们做一个交换机&#xff0c;两个队列&#xff0c;两个消费者分别连接两个队列。 定义交换…...

数据结构单链表的前插法实现

单链表的前插法实现可以通过以下步骤进行&#xff1a; 创建一个新的节点&#xff0c;并将要插入的元素存储在新节点的数据域中。 将新节点的指针域指向原链表的头节点。 将原链表的头节点指向新节点。 具体代码实现如下所示&#xff1a; class Node:def __init__(self, da…...

Cocos Creator开发学习路线

1.JavaScript与TypeScript程序设计 由于可以跨平台发布,同时要能支持h5的游戏,cocos creator选择了JavaScript与TypeScript来做为它的开发语言,所以我们要先学习JavaScript与TypeScript。TypeScript是基于JavaScript的一个语法糖,运行的时候被编译为JavaScript,所以我们要…...

C语言:IO操作

引言 I/O操作是一切实现的基础。IO即为input &output 标准IO&#xff08;stdio&#xff09; FILE类型贯穿始终&#xff0c;FILE是由typedef定义出来的 vii /usr/include/asm-generic/errno-base.h (errno定义的位置) /usr/include/x86_64-linux-gnu/bits/types/struct…...

算法 | 刷题日记

1.递归通常是用栈来实现的 递归在其本质上是通过函数调用栈&#xff08;Call Stack&#xff09;来实现的&#xff0c;而不是队列&#xff08;Queue&#xff09;。当你调用一个函数时&#xff0c;该函数的局部变量、参数和返回地址会被压入&#xff08;push&#xff09;到一个由…...

微信小程序登录接口

微信小程序登录&#xff0c;实现思路分析&#xff1a; 用户触发登录操作&#xff1a;用户在微信小程序中点击“登录”按钮&#xff0c;触发登录流程。调用微信登录接口&#xff1a;小程序端调用微信提供的登录接口&#xff08;如wx.login&#xff09;&#xff0c;获取临时登录…...

VBA实战(Excel)(5):介绍一种排列组合算法

1. 需求场景 有多个条件&#xff0c;条件个数不定&#xff0c;每个条件有若干种情况&#xff0c;情况个数不定&#xff0c;输出所有条件可能的情况的排列组合。 2.举例 假设第一次有5个情况要填&#xff0c;第一个条件20种情况&#xff0c;第二个5种&#xff0c;第三个40种&…...

迭代器的使用

参考&#xff1a; 生成器迭代器next函数 迭代器的使用 说到迭代器就必须先要提一下可迭代对象&#xff08;iterable&#xff09;&#xff0c;可迭代对象是能够逐一返回其成员项的对象。可迭代对象包括序列类型&#xff08;如list、str、tuple&#xff09;和非序列类型&#…...

安卓手机APP开发___广播概述

安卓手机APP开发___广播概述 目录 概述 关于系统广播 系统广播所发生的更改 接收广播 清单声明的接收器 上下文注册的接收器 对进程状态的影响 发送广播 通过权限限制广播 带权限的发送 带权限的接收 安全注意事项和最佳做法 概述 Android 应用可以通过 Android …...

【封装】Unity切换场景不销毁物体

在切换场景时&#xff0c;如果物体不需要销毁&#xff0c;可以直接使用下方脚本 代码 public class DontDestroyLoader : MonoBehaviour{ //所有不销毁的物体预制体[SerializeField] private GameObject[] dontDestroyPrefabs;//实例化预制体public void Load(){foreach (var …...

基于学习的决策树

基于学习的决策树概述 决策树是一种监督学习方法&#xff0c;广泛应用于分类和回归任务中。基于学习的决策树模型通过学习数据中的特征来构建树状结构&#xff0c;帮助做出决策。以下是对基于学习的决策树的详细介绍&#xff0c;包括其基本概念、工作流程、构建算法、优势和挑…...

godot.bk2

1.$node_name 其实 就是 get_node 的语法糖 2.场景内部用get_node&#xff0c;场景外部用信号 这是自定义信号的绑定&#xff0c;如果是内置信号&#xff0c;直接右键点击链接到一个函数即可 3.场景切换和摄像头一直居中 4.class_name命名一个类&#xff0c;extends继承&…...

STM32 IIC 使用 HAL 库操作eeprom

在STM32上通过I2C接口&#xff08;注意&#xff1a;在标准STM32库中&#xff0c;I2C接口通常被写为"I2C"而不是"IIC"&#xff09;与EEPROM芯片通信时&#xff0c;你需要遵循I2C通信协议&#xff0c;并使用STM32的HAL库或标准外设库&#xff08;如果适用&am…...

YOLOv8+PyQt5海洋船只检测(可以重新训练,yolov8模型,从图像、视频和摄像头三种路径识别检测)

1.效果视频&#xff1a;海洋船只检测yoloV8检测&#xff08;https://mbd.pub/o/bread/mbd-ZpaYk55r&#xff09;_哔哩哔哩_bilibili资源包含可视化的海洋船只检测系统&#xff0c;可对于高空拍摄到的海洋图片进行轮船检测&#xff0c;基于最新的YOLOv8训练的海洋船只检测模型&a…...

PCL 高阶多项式曲线回归拟合(二维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 高阶多项式曲线回归(Polynomial Regression)是一种线性回归模型的扩展,它允许数据拟合一个非线性的曲线。虽然多项式本身是非线性的,但我们可以通过引入新的变量(例如,原始变量的平方、立方等)来将问题转化为…...

深入理解 Python3 函数:从基础语法到高级应用

Python3 函数是构建模块化代码的基本单位&#xff0c;允许我们将代码组织成独立的、可重用的块。本文将详细介绍 Python3 函数的基本语法、常用命令、示例、应用场景、注意事项&#xff0c;并进行总结。 基本语法 在 Python 中&#xff0c;函数的定义使用 def 关键字&#xf…...

03_初识Spring Cloud Gateway

文章目录 一、网关简介1.1 网关提出的背景1.2 网关在微服务中的位置1.3 网关的技术选型1.4 补充 二、Spring Cloud Gateway的简介2.1 核心概念&#xff1a;路由&#xff08;Route&#xff09;2.2 核心概念&#xff1a;断言&#xff08;Predicate&#xff09;2.3 核心概念&#…...

python数据分析——线性模型

参考资料&#xff1a;活用pandas库 1、简单线性回归 线性回归的目标是描述响应变量&#xff08;或“因变量”&#xff09;和预测变量&#xff08;也称“特征”、“协变量”、“自变量”&#xff09;之间的直线关系。本例中将讨论tips数据集中的total_bill对tip的影响。 # 导入…...

网络原理——HTTP/HTTPS ---- HTTPS

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 目录 HTTPS加密与解密HTTPS的工作流程使用对称密钥来加密使用非对称密钥 来对 对称密钥进行加密第三方公证总结 HTTPS https本质上就是在http的基础之上 增加了加密层,抛开加密层之后,剩下的部…...

网络协议二

一、套接字Socket 基于 TCP UDP 协议的 Socket 编程&#xff0c;在讲 TCP 和 UDP 协议的时候&#xff0c;我们分客户端和服务端&#xff0c;在写程序的时候&#xff0c;我们也同样这样分。 在网络层&#xff0c;Socket 函数需要指定到底是 IPv4 还是 IPv6&#xff0c;分别对应设…...

内存映射mmap技术详解

一、mmap基础概念 mmap 即 memory map&#xff0c;也就是内存映射。mmap 是一种内存映射文件的方法&#xff0c;即将一个文件或者其它对象映射到进程的地址空间&#xff0c;实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后&#xff0c;…...

react 合成事件

React合成事件-CSDN博客 当然&#xff0c;很高兴为你解释React中的合成事件概念&#xff0c;非常适合React初学者理解。 想象一下&#xff0c;你正在组织一场派对&#xff0c;为了让派对顺利进行&#xff0c;你需要管理各种活动&#xff0c;比如游戏、音乐和食物分配。但是&a…...

springboot配置集成RedisTemplate和Redisson,使用分布式锁案例

文章要点 自定义配置属性类集成配置RedisTemplate集成配置分布式锁Redisson使用分布式锁简单实现超卖方案 1. 项目结构 2. 集成RedisTemplate和Redisson 添加依赖 依赖的版本与继承的spring-boot-starter-parent工程相对应&#xff0c;可写可不写 <!--spring data redis…...

随机数相关

产生随机数对象 固定写法&#xff1a; Random 随机数变量名 new Random();Random r new Random();生成随机数 int i r.Next(); //生成一个非负数的随机数 Console.WriteLine(i);i r.Next(100); // 生成一个 0~99的随机数 左边始终是0 左包含 右边是100 右不包含 Consol…...