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

数据结构之栈与队列习题详解解析

个人主页:点我进入主页

专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶

C语言刷题       数据结构初阶

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂。

目录

1.前言

2.概念题

3.编程题

3.1. 括号匹配问题。OJ链接

3.2. 用队列实现栈。OJ链接

3.3. 用栈实现队列。OJ链接

3.4. 设计循环队列。OJ链接

4.总结 


1.前言

        在上一篇文章中我们讲解了关于栈和队列的性质以及栈和队列的实现,代码还没保存吗?力扣刷题用不到吗?力扣解题出现错误调试时还想自己写一个栈和队列吗?还愣着干嘛,还不保存上。今天我们就主要针对上一篇文章的习题进行详细解析,我们先对概念题进行解析然后再搞编程题。

2.概念题

1.一个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈,然后再依次出栈,则元素出
栈的顺序是( )。
A 12345ABCDE
B EDCBA54321
C ABCDE12345
D 54321EDCBA

        我们将1,2,3,4,5,A,B,C,D,E依次入栈,我们知道栈是先进后出,所以我们的出栈顺序为EDCBA54321故答案为B.

2.若进栈序列为 1,2,3,4 ,进栈过程中可以出栈,则下列不可能的一个出栈序列是()
A 1,4,3,2
B 2,3,4,1
C 3,1,4,2
D 3,4,2,1

        针对这种题型我们最好的解决方法就是模拟栈的实现,我们进1出1,进2,进3,进4出4,出3,出2,选项A可以实现正确,我们进1,进2,出2,进3,出3,进4,出4,出1,选项B可以实现正确,我们进1,进2,进3,出3,想要出1需要将2出栈,所以错误,选择C.

3.循环队列的存储空间为 Q(1:100) ,初始状态为 front=rear=100 。经过一系列正常的入队与退队操作
后, front=rear=99 ,则循环队列中的元素个数为( )
A 1
B 2
C 99
D 0或者100

        我们知道循环队列是可以让数据进行循环,我们知道有100个位置,每个位置都占,当我们的队列空时满足front=rear,当我们的队列满时满足front=rear,故选择D.

4.以下( )不是队列的基本运算?
A 从队尾插入一个新元素
B 从队列中删除第i个元素
C 判断一个队列是否为空D 读取队头元素的值

        我们知道队列是先进先出,也就是头出,尾进,所以我们呢很容易看出选项B从队列中删除第i个元素,不满足头出,尾进,故选择B.

5.现有一循环队列,其队头指针为front,队尾指针为rear;循环队列长度为N。其队内有效长度为?(假设
队头不存放数据)
A (rear - front + N) % N + 1
B (rear - front + N) % N
C ear - front) % (N + 1)
D (rear - front + N) % (N - 1)

        我们可以得到循环队列是有一个空位,我们知道rear和front这两个位置是不定的可能在一起,也可能front在前,也可能rear在前,故我们让这两个相减然后加上N,然后对N进行取余就可以得到有效长度。

3.编程题

3.1. 括号匹配问题。OJ链接

typedef struct Stack{char* data;int top;int capacity;
}Stack;
void InItStack(Stack *s)
{assert(s);s->capacity=4;s->top=-1;s->data=(char*)malloc(sizeof(char)*s->capacity);
}
void CheckCapacity(Stack *s)
{assert(s);if(s->top+1==s->capacity)s->capacity+=2;char *p=(char*)realloc(s->data,sizeof(char)*s->capacity);if(p==NULL){perror("realloc fail");return ;}else s->data=p;
}
void StackPush(Stack *s,char ch)
{assert(s);CheckCapacity(s);s->data[++s->top]=ch;
}
bool StackEmpty(Stack*s)
{assert(s);if(s->top==-1)return true;return false ; 
}
char StackPop(Stack*s)
{assert(s);if(!StackEmpty(s)){s->top--;return s->data[s->top+1];}return '1';
}
void StackDestory(Stack *s)
{assert(s);free(s->data);
}
bool isValid(char* arr) {Stack s;InItStack(&s);int sz=strlen(arr),i;for(i=0;i<sz;i++){if(arr[i]=='('||arr[i]=='['||arr[i]=='{'){StackPush(&s,arr[i]);}else{char ch=StackPop(&s);if((arr[i]==')'&&ch=='(')||(arr[i]==']'&&ch=='[')||(arr[i]=='}'&&ch=='{')){;}else {StackDestory(&s);return false;}}}StackDestory(&s);return StackEmpty(&s);
}
本题主要用到栈的操作,我们遇到左括号入栈,遇到右括号出栈,出栈时比较是否匹配,最后看栈是否空。

3.2. 用队列实现栈。OJ链接

typedef struct QNode {int data;struct QNode* next;
}QNode;
typedef struct Queue {struct QNode* head;struct QNode* tail;
}Queue;
void QueueInit(Queue* q)
{assert(q);q->head = NULL;q->tail = NULL;
}
QNode* QueueCreate(Queue* q, int x)
{QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");return NULL;}newnode->data = x;newnode->next = NULL;return newnode;
}
void QueuePush(Queue* q, int x)
{QNode* newnode = QueueCreate(q, x);if (q->head == NULL){q->head = newnode;q->tail = newnode;}else{q->tail->next = newnode;q->tail = newnode;}
}
bool QueueEmpty(Queue* q)
{return q->head == NULL;
}
int QueuePop(Queue* q)
{assert(q);if (!QueueEmpty(q)){int data = q->head->data;if (q->head == q->tail){free(q->head);q->head = q->tail = NULL;}else{QNode* cur = q->head->next;free(q->head);q->head = cur;}return data;}return 1;
}
int QueueSize(Queue* q)
{int count = 0;QNode* cur = q->head;while (cur){count++;cur = cur->next;}return count;
}
void QueueDestory(Queue* q)
{assert(q);if (!QueueEmpty(q)){QNode* cur = q->head->next;QNode* prev = q->head;while (prev){free(prev);prev = cur;if (cur){cur = cur->next;}}}
}
void QueuePrint(Queue* q)
{assert(q);QNode* cur = q->head;while (cur){printf("%d ", cur->data);cur = cur->next;}
}
int top(Queue* q)
{assert(q);if (!QueueEmpty(q)){return q->head->data;}return 1;
}typedef struct {Queue queue1;Queue queue2;
} MyStack;MyStack* myStackCreate() {MyStack*obj=(MyStack*)malloc(sizeof(MyStack));QueueInit(&obj->queue1);QueueInit(&obj->queue2);return obj;
}void myStackPush(MyStack* obj, int x) {assert(obj);if(!QueueEmpty(&obj->queue1)){QueuePush(&obj->queue1,x);}else{QueuePush(&obj->queue2,x);}
}int myStackPop(MyStack* obj) {assert(obj);if(!QueueEmpty(&obj->queue1)){QNode*cur=(obj->queue1).head;while(cur->next!=NULL){cur=cur->next;int data=QueuePop(&obj->queue1);QueuePush(&obj->queue2,data);}return  QueuePop(&obj->queue1);}else{QNode*cur=obj->queue2.head;while(cur->next!=NULL){cur=cur->next;int data=QueuePop(&obj->queue2);QueuePush(&obj->queue1,data);}return  QueuePop(&obj->queue2);    }
}int myStackTop(MyStack* obj) {if(!QueueEmpty(&obj->queue1)){return ((obj->queue1).tail)->data;}elsereturn ( (obj->queue2).tail)->data; 
}bool myStackEmpty(MyStack* obj) {assert(obj);return QueueEmpty(&obj->queue1)&&QueueEmpty(&obj->queue2);
}void myStackFree(MyStack* obj) {assert(obj);QueueDestory(&obj->queue1);QueueDestory(&obj->queue2);free(obj);
}
typedef struct QNode {int data;struct QNode* next;
}QNode;
typedef struct Queue {struct QNode* head;struct QNode* tail;
}Queue;
void QueueInit(Queue* q)
{assert(q);q->head = NULL;q->tail = NULL;
}
QNode* QueueCreate(Queue* q, int x)
{QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");return NULL;}newnode->data = x;newnode->next = NULL;return newnode;
}
void QueuePush(Queue* q, int x)
{QNode* newnode = QueueCreate(q, x);if (q->head == NULL){q->head = newnode;q->tail = newnode;}else{q->tail->next = newnode;q->tail = newnode;}
}
bool QueueEmpty(Queue* q)
{return q->head == NULL;
}
int QueuePop(Queue* q)
{assert(q);if (!QueueEmpty(q)){int data = q->head->data;if (q->head == q->tail){free(q->head);q->head = q->tail = NULL;}else{QNode* cur = q->head->next;free(q->head);q->head = cur;}return data;}return 1;
}
int QueueSize(Queue* q)
{int count = 0;QNode* cur = q->head;while (cur){count++;cur = cur->next;}return count;
}
void QueueDestory(Queue* q)
{assert(q);if (!QueueEmpty(q)){QNode* cur = q->head->next;QNode* prev = q->head;while (prev){free(prev);prev = cur;if (cur){cur = cur->next;}}}
}
void QueuePrint(Queue* q)
{assert(q);QNode* cur = q->head;while (cur){printf("%d ", cur->data);cur = cur->next;}
}
int top(Queue* q)
{assert(q);if (!QueueEmpty(q)){return q->head->data;}return 1;
}typedef struct {Queue queue1;Queue queue2;
} MyStack;MyStack* myStackCreate() {MyStack*obj=(MyStack*)malloc(sizeof(MyStack));QueueInit(&obj->queue1);QueueInit(&obj->queue2);return obj;
}void myStackPush(MyStack* obj, int x) {assert(obj);if(!QueueEmpty(&obj->queue1)){QueuePush(&obj->queue1,x);}else{QueuePush(&obj->queue2,x);}
}int myStackPop(MyStack* obj) {assert(obj);if(!QueueEmpty(&obj->queue1)){QNode*cur=(obj->queue1).head;while(cur->next!=NULL){cur=cur->next;int data=QueuePop(&obj->queue1);QueuePush(&obj->queue2,data);}return  QueuePop(&obj->queue1);}else{QNode*cur=obj->queue2.head;while(cur->next!=NULL){cur=cur->next;int data=QueuePop(&obj->queue2);QueuePush(&obj->queue1,data);}return  QueuePop(&obj->queue2);    }
}int myStackTop(MyStack* obj) {if(!QueueEmpty(&obj->queue1)){return ((obj->queue1).tail)->data;}elsereturn ( (obj->queue2).tail)->data; 
}bool myStackEmpty(MyStack* obj) {assert(obj);return QueueEmpty(&obj->queue1)&&QueueEmpty(&obj->queue2);
}void myStackFree(MyStack* obj) {assert(obj);QueueDestory(&obj->queue1);QueueDestory(&obj->queue2);free(obj);
}

        我们用队列实现栈,这主要对栈和队列性质的考察,我们入栈就是寻找空队列入队,出栈是将非空队列出队剩下一个数据,这一个数据就是要出栈的数据,栈顶就是队尾的数据。

3.3. 用栈实现队列。OJ链接

typedef struct Stack {int* data;int top;int capacity;
}Stack;void InItStack(Stack* s)
{assert(s);s->capacity = 4;s->top = -1;s->data = (int*)malloc(sizeof(int) * s->capacity);
}
void CheckCapacity(Stack* s)
{assert(s);if (s->top + 1 == s->capacity)s->capacity += 2;int* p = (int*)realloc(s->data, sizeof(int) * s->capacity);if (p == NULL){perror("realloc fail");return;}elses->data = p;
}
void StackPush(Stack* s, int ch)
{assert(s);CheckCapacity(s);s->data[++s->top] = ch;
}
bool StackEmpty(Stack* s)
{assert(s);if (s->top == -1)return true;return false;
}
int StackPop(Stack* s)
{assert(s);if (!StackEmpty(s)){s->top--;return s->data[s->top + 1];}return '1';
}
void StackDestory(Stack* s)
{assert(s);free(s->data);
}
int StackSize(Stack* s)
{assert(s);return s->top + 1;
}
int StackTopdata(Stack* s)
{assert(s);return s->data[s->top];
}typedef struct {Stack s1;Stack s2;
} MyQueue;MyQueue* myQueueCreate() {MyQueue*obj=(MyQueue*)malloc(sizeof(MyQueue));InItStack(&obj->s1);InItStack(&obj->s2);return obj;
}void myQueuePush(MyQueue* obj, int x) {assert(obj);if(!StackEmpty(&obj->s1)){StackPush(&obj->s1,x);}else{StackPush(&obj->s2,x);}
}int myQueuePop(MyQueue* obj) {assert(obj);int data;if(!StackEmpty(&obj->s1)){while(!StackEmpty(&obj->s1)){StackPush(&obj->s2,StackPop(&obj->s1));}data=StackPop(&obj->s2);while(!StackEmpty(&obj->s2)){StackPush(&obj->s1,StackPop(&obj->s2));}}else{while(!StackEmpty(&obj->s2)){StackPush(&obj->s1,StackPop(&obj->s2));}data=StackPop(&obj->s1);while(!StackEmpty(&obj->s1)){StackPush(&obj->s2,StackPop(&obj->s1));}}return data;
}int myQueuePeek(MyQueue* obj) {assert(obj);if(!StackEmpty(&obj->s1)){return (obj->s1).data[0];}elsereturn (obj->s2).data[0];
}bool myQueueEmpty(MyQueue* obj) {assert(obj);return StackEmpty(&obj->s1)&&StackEmpty(&obj->s2);
}void myQueueFree(MyQueue* obj) {assert(obj);free((obj->s1).data);free((obj->s2).data);free(obj);
}

        这道题也是考察栈和队列的性质 ,入队就是寻找非空的栈入栈(都为空时入第二个栈),由于队列是先进先出,所以我们将非空栈全部转到空栈,栈是先进后出,所以数据会倒置,栈顶就是第一个进入的数据,让他出栈就是出队,然后再次倒置回去,正常操作即可。


3.4. 设计循环队列。OJ链接


typedef struct {int* data;int capacity;int head;int tail;
} MyCircularQueue;bool myCircularQueueIsEmpty(MyCircularQueue* obj) {if(obj->tail==obj->head){return true;}return false;
}bool myCircularQueueIsFull(MyCircularQueue* obj) {assert(obj);if((obj->tail+1)%(obj->capacity+1)==obj->head)return true;elsereturn false;
}void myCircularQueueFree(MyCircularQueue* obj) {assert(obj);free(obj->data);free(obj);
}MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue*queue=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));queue->data=(int*)malloc(sizeof(int)*(k+1));queue->capacity=k;queue->head=queue->tail=0;return queue;
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {assert(obj);if(!myCircularQueueIsFull(obj)){obj->data[obj->tail]=value;obj->tail=(obj->tail+1)%(obj->capacity+1);return true;}return false;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {assert(obj);if(!myCircularQueueIsEmpty(obj)){obj->head=(obj->head+1)%(obj->capacity+1);return true;}return false;
}int myCircularQueueFront(MyCircularQueue* obj) {assert(obj);if(!myCircularQueueIsEmpty(obj))return obj->data[obj->head];return -1;
}int myCircularQueueRear(MyCircularQueue* obj) {assert(obj);if(!myCircularQueueIsEmpty(obj)){return obj->data[(obj->tail+obj->capacity)%(obj->capacity+1)];}return -1;
}

        循环队列我们利用数组或链表都可以,当我们使用数组时只需要进行推理即可以得到数据的下标,链表在判断队列满和空比较困难,所以我们选择数组,尤其是找队列的头和尾,判断对满就是(obj->tail+1)%(obj->capacity+1)==obj->head,队列空就是obj->tail=obj->head;

4.总结 

        今天的内容主要是对栈和队列的性质和操作进行深入学习,还有一个特别重要的就是我们在写题的时候我们的栈,队列,链表的外接函数我们可以进行复制过来,特别注意,我们可以称之为cv操作,今天的内容就到这里了,希望大家可以学到很多。

相关文章:

数据结构之栈与队列习题详解解析

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.前言 2.概念题…...

C++ 动态规划 DP教程 (一)思考过程(*/ω\*)

动态规划是一种思维方法&#xff0c;大家首先要做的就是接受这种思维方法&#xff0c;认同他&#xff0c;然后再去运用它解决新问题。 动态规划是用递推的思路去解决问题。 首先确定问题做一件什么事情&#xff1f; 对这件事情分步完成&#xff0c;分成很多步。 如果我们把整件…...

【python基础(九)】文件和异常详解:使用、读取、写入、追加、保存用户的信息,以及优雅的处理异常

文章目录 一. 从文件中读取数据1. 读取整个文件2. 文件路径3. 逐行读取4. 创建一个包含文件各行内容的列表 二. 写入文件1. 写入空文件2. 写入多行3. 附加到文件 三. 异常1. 处理ZeroDivisionError异常2. 使用try-except代码块3. try-except-else ing4. 处理FileNotFoundError异…...

详解C语言中的指针数组和数组指针

指针数组和数组指针是 C 语言中比较常见的两种类型。它们虽然名字很相似&#xff0c;但是含义、用法以及指向类型都不同&#xff0c;需要分开理解。 指针数组 指针数组是一个数组&#xff0c;其中每个元素都是一个指针。这些指针可以指向不同类型的数据&#xff0c;也可以指向…...

【done】剑指offer18:删除链表指定节点

力扣&#xff0c;https://leetcode.cn/problems/shan-chu-lian-biao-de-jie-dian-lcof/description/ // 自己写的答案 class Solution {public ListNode deleteNode(ListNode head, int val) {if (head null) {return null;}if (head.val val) {return head.next;}ListNode …...

图形编辑器开发:缩放和旋转控制点

大家好&#xff0c;我是前端西瓜哥。好久没写图形编辑器开发的文章了。 今天来讲讲控制点。它是图形编辑器的不可缺少的基础功能。 控制点是吸附在图形上的一些小矩形和圆形点击区域&#xff0c;在控制点上拖拽鼠标&#xff0c;能够实时对被选中进行属性的更新。 比如使用旋…...

【2023 云栖】阿里云田奇铣:大模型驱动 DataWorks 数据开发治理平台智能化升级

云布道师 本文根据 2023 云栖大会演讲实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a;田奇铣 | 阿里云 DataWorks 产品负责人 演讲主题&#xff1a;大模型驱动 DataWorks 数据开发治理平台智能化升级 随着大模型掀起 AI 技术革新浪潮&#xff0c;大数…...

Rust语言入门教程(二) - 变量与作用域

变量与作用域 变量的声明与初始化 Rust的基本语法格式如下&#xff1a; fn main(){let bunnies 2; }语句以分号结尾&#xff0c;用花括号包含语句块。 Rust的语法其实借鉴了很多其他的语言&#xff0c;比如C语言和Python&#xff0c; 所以变量定义的格式看起来也跟很多我们…...

芯知识 | Flash可更换声音语音芯片—引领音频IC技术革新的新篇章

随着科技的飞速发展&#xff0c;人们对于电子产品的音频性能要求越来越高。在这种背景下&#xff0c;Flash可更换声音语音芯片应运而生&#xff0c;成为音频技术领域的一颗璀璨明星。本文将详细介绍Flash可更换声音语音芯片的特点、优势以及应用场景&#xff0c;展望其在未来科…...

合共软件创新亮相:第102届上海电子展成就技术新篇章

2023年&#xff0c;第102届中国&#xff08;上海&#xff09;电子展活动在全球瞩目中圆满落幕。作为下半年华东地区最具影响力的电子展会&#xff0c;此次盛会吸引了来自全球的600家领先企业&#xff0c;共同探讨电子元器件行业的最新发展成果和趋势。 本届展会围绕核心先导元器…...

Ubuntu20.04清理垃圾vscode缓存

使用VM虚拟机安装了Ubuntu系统&#xff0c;主目录空间越来越小&#xff0c;硬盘扩容之后很快又空间不足&#xff0c;甚至出现了开机卡黑屏的情况&#xff0c;这里记录一下解决过程。 1 重新开机进入系统 状态&#xff1a;卡到了开机黑屏状态&#xff0c;左上角有一条小横杠 原…...

网络数据结构skb_buff原理

skb_buff基本原理 内核中sk_buff结构体在各层协议之间传输不是用拷贝sk_buff结构体&#xff0c;而是通过增加协议头和移动指针来操作的。如果是从L4传输到L2&#xff0c;则是通过往sk_buff结构体中增加该层协议头来操作&#xff1b;如果是从L4到L2&#xff0c;则是通过移动sk_…...

SpringCache使用详解

SpringCache 1.新建测试项目SpringCache2.SpringCache整合redis2.1.Cacheable2.2.CacheEvict2.3.Cacheput2.4.Caching2.5.CacheConfig 3.SpringCache问题4.SpringCache实现多级缓存 1.新建测试项目SpringCache 引入依赖 <dependencies><dependency><groupId&g…...

windows版本的grafana如何离线安装插件

本文以安装clickhouse的插件为例&#xff0c;记录下如何离线安装插件 1 下载插件 ClickHouse plugin for Grafana | Grafana Labs 2 找到grafana的配置文件 打开编辑&#xff0c;搜索plugin关键字&#xff0c;修改plugin的加载目录 目录不存在&#xff0c;手动创建&#xff0…...

ElasticSearch01

ElasticSearch 版本&#xff1a;7.8 学习视频&#xff1a;尚硅谷 笔记&#xff1a;https://zgtsky.top/ ElasticSearch介绍 Elaticsearch&#xff0c;简称为es&#xff0c; es是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b…...

GPT、GPT-2、GPT-3论文精读笔记

视频&#xff1a;GPT&#xff0c;GPT-2&#xff0c;GPT-3 论文精读【论文精读】_哔哩哔哩_bilibili MAE论文&#xff1a;把bert用回计算机视觉领域 CLIP论文&#xff1a;打通文本和图像 GPT 论文&#xff1a;Improving Language Understanding by Generative Pre-Training …...

深度学习八股文:混合精度训练过程出nan怎么办

其实如果是FP32的训练&#xff0c;基本的调试方法还是差不多&#xff0c;这里就讲一下混合精度训练过程中的nan。 混合精度训练使用较低的数值精度&#xff08;通常是半精度浮点数&#xff0c;例如FP16&#xff09;来加速模型训练&#xff0c;但在一些情况下&#xff0c;可能会…...

竞赛选题 题目:基于卷积神经网络的手写字符识别 - 深度学习

文章目录 0 前言1 简介2 LeNet-5 模型的介绍2.1 结构解析2.2 C1层2.3 S2层S2层和C3层连接 2.4 F6与C5层 3 写数字识别算法模型的构建3.1 输入层设计3.2 激活函数的选取3.3 卷积层设计3.4 降采样层3.5 输出层设计 4 网络模型的总体结构5 部分实现代码6 在线手写识别7 最后 0 前言…...

Cesium-terrain-builder编译入坑详解

本以为编译cesium-terrian-tools编译应该没那么难&#xff0c;不想问题重重&#xff0c;不想后人重蹈覆辙&#xff0c;也记录下点点滴滴。 目前网上存在的cesium代码版本主要有两个分支&#xff1a; 原始网站【不能生成layer文件&#xff0c;且经久不更新&#xff0c;使用gdal…...

3.1 CPU内部结构与时钟与指令

CPU内部结构 总线一些自定义部件总线图内存指令执行流程:取指令,译码,执行pc做的事内存地址寄存器内存缓存寄存器指令寄存器,译码第一步指令寄存器传递地址到内存地址寄存器指令MOV_A的过程(译码第二步)第一条指令执行完毕第三条指令的执行第四条指令第四条指令不同的执行流程…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...