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

顺序表(一篇带你掌握顺序表)

目录

一、顺序表是什么

1.1 概念

1.2 分类

1.3 结构

二、顺序表的基本操作

2.1 前绪准备

2.2 初始化

2.3  扩容

2.5 尾插

 2.6 打印

2.7 尾删

2.8 头插

 2.9 头删

 2.10 在pos位置插入

 2.11 删除pos位置的数据

 2.12 查找

三、完整代码

3.1 Test.c文件

3.2 SeqList.h文件

3.3 SeqList.c文件

四、与顺序表相关的例题

4.1 移除元素

4.1.1 题目描述

4.1.2 题目分析

4.2 删除有序数组中的重复项

4.2.1 题目描述

4.2.2 题目分析

4.3 合并两个有序数组

4.3.1 题目描述

4.3.2 题目分析

五、顺序表的缺陷

一、顺序表是什么

1.1 概念

      顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改。

1.2 分类

     顺序表可以分为静态顺序表动态顺序表

  1. 静态顺序表:使用定长数组存储元素。
  2. 动态顺序表:使用动态开辟的数组存储。

相对来说动态顺序表的优势大,静态顺序表,不太实用,局限性大。

1.3 结构

     顺序表需要对存储的数据进行管理,存储的数据本质上是使用数组存储,要对数据进行管理就需要知道顺序表中存储元素的个数,其次如果创建的是动态的顺序表,那么还需要记录下它的容量,对于动态顺序表,我们单用某一种类型的变量无法将他准确的描述出来,它包含顺序表有效元素个数,顺序表的容量以及顺序表开辟的空间的地址三个主要元素,无法使用某种单一的类型来表示,所以我们需要定义一个结构体类型。     

typedef struct SeqList
{SLDataType* a;   //开辟的空间的起始地址int size;     //有效数据的个数int capacity;   //空间容量
}SL;

一个简单的顺序表可以由下图来表示:


     

二、顺序表的基本操作

     在此处,我们分装成SeqList.h、SeqList.c以及Test.c这三个文件来实现顺序表的完整操作,在SeqList.h中定义顺序表需要的函数,SeqList.c中实现顺序表的操作,Test.c中实现主函数,完成一系列的操作,在本文章的第二部分,主要是对顺序表的每个操作进行讲解,整体实现在第三部分。

顺序表主要有以下操作

void SeqInit(SL* s);    //初始化
void SeqDestory(SL* s);           //销毁
void SLPushBack(SL* s, SLDataType x);       //尾插
void SLPrint(SL* s);        //打印
void SLPopBack(SL* s);     //尾删
void SLCheckCapacity(SL* s);      //扩容
void SLPushFront(SL* s, SLDataType x);        //头插
void SLPopFront(SL* s);      //头删
void SLInsert(SL* s,int pos, SLDataType x);           //从pos位置插入
void SLErase(SL* s, int pos);        //删除pos位置的元素
int SLFind(SL* s, SLDataType x);             //找某个数在顺序表中的位置

2.1 前绪准备

     我们是创建的动态顺序表,即动态开辟空间,空间不够再进行扩容操作,为了我们写的顺序表有更广泛地使用,定义 INIT_CAPACITY 来表示容量大小,以便我们后续对容量进行改变。我们在此顺序表设置的起始开辟的容量为4(在本文章展示的顺序表存储的是int类型数据,这里指的是开辟4个int类型的空间,即16字节的空间)。

#define INIT_CAPACITY 4

     顺序表中可以存储不同类型的元素,为了使我们写的顺序表具有广泛性,在这里我们使类型重定义,用SLDataType代表某种类型。在本文章中我们存储的是int类型的数据。

typedef int SLDataType;

2.2 初始化

     对于一个顺序表,我们主要关注顺序表有效元素个数,顺序表的容量以及顺序表开辟的空间的地址三个主要元素,对他进行初始化,即对这三个要素进行初始化。

     对于顺序表的初始化函数,我们需要注意传参的时候需要传的是地址,我们在此函数中,需要改变结构体的内容,就要传结构体的指针,很多同学在这里会出现以下错误,我们通过图来解释:
 

void SeqInit(SL* ps)
{assert(ps);     //断言,ps为空时,顺序表不存在,再进行下面操作没有意义ps->a = (SLDataType*)malloc(INIT_CAPACITY * sizeof(SLDataType));     //动态开辟空间if (ps->a == NULL)         //判断开辟空间是否成功{perror("malloc fail");return;}ps->size = 0;ps->capacity = INIT_CAPACITY;
}

     上面开辟空间时,我们使用了malloc函数,对此函数不了解的可以参照下图:

2.3  扩容

     在对顺序表进行插入的时候,有可能存在将开辟的空间用完的情况即空间中存储的数据有效个数与容量相等,这个时候我们就需要进行扩容,一般是将容量扩充到当前的二倍。

     我们需要注意:

  • realloc的第二个参数传的是扩容后的总字节数。
  • realloc分为原地扩容和异地扩容,如果是原地扩容那么realloc调用后返回的地址与原空间的地址相同,如果是异地扩容,那么realloc将返回新的地址,所以在这里我们需要将tmp的值赋给ps->a。
void SLCheckCapacity(SL* ps)             //扩容
{assert(ps);if (ps->size == ps->capacity){SLDataType * tmp = (SLDataType*)realloc(ps->a, ps->capacity * sizeof(SLDataType)*2);if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;ps->capacity *= 2;}
}

     上述函数中在扩容的时候我们使用的是realloc函数,对他使用不熟练的同学可以看下图:

2.5 尾插

      对于顺序表的尾插,我们主要需要注意以下两个问题:

  • 需要考虑是否扩容,这里直接复用上面的扩容函数

     尾插的原理:

void SLPushBack(SL* ps, SLDataType x)       //尾插
{assert(ps);SLCheckCapacity(ps);ps->a[ps->size] = x;ps->size++;
}

 2.6 打印

     我们对顺序表进行增删查改等操作后需要打印来观察顺序表是否进行了增删查改操作。

void SLPrint(SL* ps)        //打印
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}

2.7 尾删

     对于顺序表的尾删,我们需要知道顺序表主要是通过size来看空间中的有效数据个数,对于尾删,只需要使size--即可。

     尾删有个前提条件就是空间中存在数据,如果空间中没有数据,那么删除就会出问题,在这里我们使用assert(断言),assert后面括号中的内容为假就会直接报错,为真操作忽略。

     

尾删的代码如下:

void SLPopBack(SL* ps)    //尾删
{assert(ps);assert(ps->size > 0);ps->size--;}

     注意:对于动态开辟的空间在释放时只能整块整块的释放,不能在中间随意位置进行释放。

2.8 头插

     顺序表的底层存储是数组,且是连续的地址进行存储,如果要在头部插入一个数据,那么就要移动后面的数据。

void SLPushFront(SL* ps, SLDataType x)        //头插
{assert(ps);SLCheckCapacity(ps);int end = ps->size-1;while (end >= 0){ps->a[end+1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;
}

 2.9 头删

     顺序表的头删与头插正好相反,他需要从前向后挪动数据,具体情况如下:
 

void SLPopFront(SL* ps)      //头删
{assert(ps);assert(ps->size > 0);int begin = 0;while (begin < ps->size - 1){ps->a[begin] = ps->a[begin + 1];begin++;}ps->size--;
}

 2.10 在pos位置插入

     在pos位置插入,我们首先要对pos位置是否合法进行判断,避免出现越界等问题,其次此函数也可以在头插,尾插函数中进行复用。

void SLInsert(SL* ps, int pos, SLDataType x)         //从pos位置插入
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);int end = ps->size;while (end > pos){ps->a[end] = ps->a[end - 1];end--;}ps->a[pos] = x;ps->size++;
}

 2.11 删除pos位置的数据

     删除pos位置的数据,首先也要判断pos位置是否合法,其次删除pos位置,要将pos位置之后的数据依次往前挪动。

void SLErase(SL* ps, int pos)        //删除pos位置的元素
{assert(ps);assert(pos>=0&&pos<ps->size);int begin = pos;while (begin < ps->size - 1){ps->a[begin] = ps->a[begin + 1];begin++;}ps->size--;
}

 2.12 查找

     我们有时候会在顺序表中找某一个值,就用到了查找函数。

int SLFind(SL* ps, SLDataType x)             //找某个数在顺序表中的位置
{assert(ps);int search = 0;while (search < ps->size){if (x == ps->a[search]){return search;}}return -1;
}

     在此函数中,如果找到,返回下标,没有找到,就返回-1.

三、完整代码

     注意由于顺序表的操作多,在每写完一个操作后,我们最好测试一下,所以在Test.c中有多个测试函数。

3.1 Test.c文件

#include "SeqList.h"void TestSeqList1()
{SL s;SeqInit(&s);    //初始化SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 4);SLPushBack(&s, 5);SLPrint(&s);SeqDestory(&s);           //销毁}void TestSeqList2()
{SL s;SeqInit(&s);    //初始化SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 4);SLPushBack(&s, 5);SLPrint(&s);SLPopBack(&s);SLPrint(&s);SLPopBack(&s); SLPrint(&s);SLPopBack(&s);SLPopBack(&s);SLPopBack(&s);SLPrint(&s);SeqDestory(&s);           //销毁}void TestSeqList3()
{SL s;SeqInit(&s);    //初始化SLPushFront(&s, 1);SLPushFront(&s, 2);SLPushFront(&s, 3);SLPushFront(&s, 4);SLPushFront(&s, 5);SLInsert(&s, 2, 10);SLPrint(&s);SLErase(&s,2);SLPrint(&s);SLPopFront(&s);SLPrint(&s);SLPopFront(&s);SLPrint(&s);SLPopFront(&s);SLPopFront(&s);SLPopFront(&s);SLPrint(&s);SeqDestory(&s);           //销毁}int main() 
{TestSeqList3();return 0;}

3.2 SeqList.h文件

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1#include <stdlib.h>
#include<stdio.h>
#include<assert.h>typedef int SLDataType;
#define N 10
#define INIT_CAPACITY 4静态顺序表
//typedef struct SeqList
//{
//	SLDataType a[N];
//	int size;
//};//动态顺序表
typedef struct SeqList
{SLDataType* a;   //开辟的空间的起始地址int size;     //有效数据的个数int capacity;   //空间容量
}SL;void SeqInit(SL* s);    //初始化
void SeqDestory(SL* s);           //销毁
void SLPushBack(SL* s, SLDataType x);       //尾插
void SLPrint(SL* s);        //打印
void SLPopBack(SL* s);     //尾删
void SLCheckCapacity(SL* s);      //扩容
void SLPushFront(SL* s, SLDataType x);        //头插
void SLPopFront(SL* s);      //头删
void SLInsert(SL* s,int pos, SLDataType x);           //从pos位置插入
void SLErase(SL* s, int pos);        //删除pos位置的元素
int SLFind(SL* s, SLDataType x);             //找某个数在顺序表中的位置

3.3 SeqList.c文件

#include "SeqList.h"
void SeqInit(SL * ps)
{assert(ps);ps->a = (SLDataType*)malloc(INIT_CAPACITY * sizeof(SLDataType));if (ps->a == NULL){perror("malloc fail");return;}ps->size = 0;ps->capacity = INIT_CAPACITY;
}void SeqDestory(SL* ps)          //销毁
{free(ps->a);ps->a = NULL;ps->size = 0;ps->capacity = 0;
}void SLPushBack(SL* ps, SLDataType x)       //尾插
{assert(ps);SLCheckCapacity(ps);ps->a[ps->size] = x;ps->size++;
}void SLCheckCapacity(SL* ps)             //扩容
{assert(ps);if (ps->size == ps->capacity){SLDataType * tmp = (SLDataType*)realloc(ps->a, ps->capacity * sizeof(SLDataType)*2);if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;ps->capacity *= 2;}
}void SLPrint(SL* ps)        //打印
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}void SLPopBack(SL* ps)    //尾删
{assert(ps);assert(ps->size > 0);ps->size--;}void SLPushFront(SL* ps, SLDataType x)        //头插
{assert(ps);SLCheckCapacity(ps);int end = ps->size-1;while (end >= 0){ps->a[end+1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;
}void SLPopFront(SL* ps)      //头删
{assert(ps);assert(ps->size > 0);int begin = 0;while (begin < ps->size - 1){ps->a[begin] = ps->a[begin + 1];begin++;}ps->size--;
}void SLInsert(SL* ps, int pos, SLDataType x)         //从pos位置插入
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);int end = ps->size;while (end > pos){ps->a[end] = ps->a[end - 1];end--;}ps->a[pos] = x;ps->size++;
}void SLErase(SL* ps, int pos)        //删除pos位置的元素
{assert(ps);assert(pos>=0&&pos<ps->size);int begin = pos;while (begin < ps->size - 1){ps->a[begin] = ps->a[begin + 1];begin++;}ps->size--;
}int SLFind(SL* ps, SLDataType x)             //找某个数在顺序表中的位置
{assert(ps);int search = 0;while (search < ps->size){if (x == ps->a[search]){return search;}}return -1;
}

四、与顺序表相关的例题

4.1 移除元素

4.1.1 题目描述

题目链接:https://leetcode.cn/problems/remove-element/

     给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

     不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

     元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

4.1.2 题目分析

思路一:

     以空间换时间,本方法主要是在创建一个数组arr,用一个指针遍历原数组,将原数组中不等于val的值依次存放在arr数组中,然后将arr数组中的内容拷贝到原数组中。

     注意此方法的时间复杂度是:O(n),我们要对原数组遍历一遍,需要有一个循环,基本语句的执行次数是n次,此方法的空间复杂度是:O(n),由于在力扣环境中不支持C99中的变长数组,所以我们这里创建的数组个数按照题目中nums数组的最大个数来看,但是它的量级依然属于n。

int removeElement(int* nums, int numsSize, int val) 
{int arr[100]={0};int src = 0;int dst = 0;while(src < numsSize){if (nums[src] == val){src++;}else{arr[dst++] = nums[src++];}}memcpy(nums,arr,dst*sizeof(int));return dst;
}

思路二:

     双指针,定义两个指针,src和dst,都从下标为0开始,如果src处的值不等于val,把它赋值到dst处,然后dst和src都加1,如果src处的值等于val,只对src加1,依次往后遍历,直到src=numsSize结束。

     此方法的时间复杂度为:O(n),其中 n 为序列的长度。我们只需要遍历该序列至多两次。空间复杂度是:O(1),我们只需要常数的空间保存若干变量。

int removeElement(int* nums, int numsSize, int val) 
{int src = 0;int dst = 0;while (src < numsSize){if (nums[src] == val){src++;}else{nums[dst] = nums[src];dst++;src++;}}return dst;
}

4.2 删除有序数组中的重复项

4.2.1 题目描述

题目链接:26. 删除有序数组中的重复项 - 力扣(LeetCode)

     给你一个升序排列的数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。元素的 相对顺序应该保持一致 。  

4.2.2 题目分析

思路:

     双指针,如果src和dst下标对应的值相同那么dst加1,如果src和dst下标对应的值不相同src加1,然后那dst下标对应的值赋给src下标对应的值。

int removeDuplicates(int* nums, int numsSize)
{int src = 0;int dst = 1;while (dst < numsSize){if (nums[dst] == nums[src]){dst++;}else{src++;nums[src] = nums[dst];dst++;}}return src + 1;
}

4.3 合并两个有序数组

4.3.1 题目描述

题目链接:88. 合并两个有序数组 - 力扣(LeetCode)

     给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n ,分别表示 nums1和nums2中的元素数目

     请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列

4.3.2 题目分析

思路:

     我们要将两个数组合并,如果都从前面即下标为0处开始比较,会涉及较多的移动数据问题,所以我们倒着比,用三个指针,其中dst是合并好数组的最后一个下标,end2是nums2数组的最后一个下标,end1是nums1数组的最后一个下标,如果nums[end2]大于nums[end1]则移动到nums1[dst]位置上。

     

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{int end1 = m - 1;int end2 = n - 1;int dst = m + n - 1;while (end1 >= 0 && end2 >= 0){if (nums1[end1] < nums2[end2]){nums1[dst] = nums2[end2];end2--;dst--;}else{nums1[dst] = nums1[end1];end1--;dst--;}}while (end2 >= 0){nums1[dst--] = nums2[end2--];}
}

五、顺序表的缺陷

顺序表有许多的问题:

  1. 中间/头部的插入删除,时间复杂度为:O(N)
  2. 增容需要申请新空间,拷贝数据,释放旧空间,会有不小的消耗。
  3. 增容一般呈2倍的增长,势必会有一定的空间浪费。

相关文章:

顺序表(一篇带你掌握顺序表)

目录 一、顺序表是什么 1.1 概念 1.2 分类 1.3 结构 二、顺序表的基本操作 2.1 前绪准备 2.2 初始化 2.3 扩容 2.5 尾插 2.6 打印 2.7 尾删 2.8 头插 2.9 头删 2.10 在pos位置插入 2.11 删除pos位置的数据 2.12 查找 三、完整代码 3.1 Test.c文件 3.2 SeqList.h…...

【SpringCloud】SpringCloud教程之Feign实战

目录前言SpringCloud Feign远程服务调用一.需求二.两个服务的yml配置和访问路径三.使用RestTemplate远程调用(order服务内编写)四.构建Feign(order服务内配置)五.自定义Feign配置(order服务内配置)六.Feign配置日志(oder服务内配置)七.Feign调优(order服务内配置)八.抽离Feign前…...

嵌入式linux必备内存泄露检测神器

Valgrind介绍 Valgrind是一个可移植的动态二进制分析工具集&#xff0c;主要用于发现程序中的内存泄漏、不合法内存访问、使用未初始化的内存、不正确的内存释放以及性能问题等&#xff0c;可在Linux和Mac OS X等平台上使用。 Valgrind由多个工具组成&#xff0c;其中最常用的…...

设计模式之行为型模式

四、行为型模式 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式&#xff0c;前者采用继承机制来在…...

解密 三岁的三岁到底为什么叫做三岁?

机缘 那一年&#xff0c;一次奇奇怪怪的挫折与一次奇奇怪怪的成长。 在学习Python的路上总觉得少了点什么&#xff0c;是心情&#xff1f;是机遇&#xff1f;还是力量&#xff1f; 都不是又都是&#xff01; 缺少一个实践和记忆的平台 记性不好是硬伤 前一天学的下一秒就忘记了…...

id选择器

id选择器可以为特定的id的标签进行css美化 使用方法&#xff1a; 标签内设好 id值&#xff0c; CSS的id选择器以“#id名”来调用 注意 所有标签都有id值id属性值类似于身份证号码&#xff0c;在一个页面中是唯一的值&#xff0c;不可重复一个标签上只能有一个id属性值一个id属性…...

《科技之巅3》读书笔记

文章目录书籍信息人工智能&#xff0c;“吃一堑长一智”的机器人机交互&#xff0c;为解决“交流障碍”问题而生硬件与算法&#xff0c;好马还需好鞍模式创新&#xff0c;赋予技术新的定义云与数据共享&#xff0c;灵活应对信息的爆发式增长“机器人”&#xff0c;从电影和小说…...

18.用于大型程序的工具

文章目录用于大型程序的工具18.1异常处理18.1.1抛出异常栈展开栈展开过程中对象被自动销毁析构函数与异常异常对象18.1.2捕获异常查找匹配的处理代码重新抛出捕获所有异常的处理代码18.1.3函数try语句块与构造函数18.1.4noexcept异常说明违反异常说明异常说明的实参noexcept运算…...

mysql一主键uuid和自增的选择

文章目录 1.自增ID的优缺点1.1 优点1.2 缺点1.3 不适合以自增ID主键作为主键的情况2.UUID作为主键2.1 介绍2.2 优点2.3 缺点3.有序UUID作为主键3.1 介绍3.2 演示使用3.2.1 前提知识3.2.1.1 数据类型 - binary3.2.1.2 函数 - hex()3.2.1.3 函数 - unhex()3.2.2 数据库层3.2.3 JA…...

【EDA工具使用】——VCS和Verdi的联合仿真的简单使用

目录 1.芯片开发所需的工具环境 2.编译仿真工具 3.三步式混合编译仿真&#xff08;最常用&#xff09;​编辑 4.两步式混合编译仿真​编辑 5.VCS的使用 ​6.verdi的使用 1.产生fsdb文件的两种方法​编辑 1.芯片开发所需的工具环境 2.编译仿真工具 3.三步式混合编译仿真…...

【Java学习笔记】4.Java 对象和类

前言 本章介绍Java的对象和类。 Java 对象和类 Java作为一种面向对象语言。支持以下基本概念&#xff1a; 多态继承封装抽象类对象实例方法重载 本节我们重点研究对象和类的概念。 对象&#xff1a;对象是类的一个实例&#xff08;对象不是找个女朋友&#xff09;&#x…...

39. 实战:基于api接口实现视频解析播放(32接口,窗口化操作,可导出exe,附源码)

目录 前言 目的 思路 代码实现 需要导入的模块 1. 导入解析网站列表&#xff0c;实现解析过程 2. 设计UI界面 3. 设置窗口居中和循环执行 4. 注意事项 完整源码 运行效果 总结 前言 本节将类似34. 实战&#xff1a;基于某api实现歌曲检索与下载&#xff08;附完整…...

基于灵动 MM32 微控制器的便携式血氧仪方案

基于灵动 MM32 微控制器的便携式血氧仪&#xff1a; - Cortex-M0() 最高主频 72MHz 可实现血氧饱和度信号采集、算法操作和 LED 显示操作 - 高性能的 1Msps 12b ADC 能对光电采样结果进行大数据量的暂存和处理&#xff0c;提高采样的效率并有助于对结果做高精度的计算 - 100…...

2022秋-2023-中科大-数字图像分析-期末考试试卷回忆版

今天晚上刚考完&#xff0c;心累&#xff0c;在这里继续授人以渔(仅供参考&#xff0c;切勿对着复习不看ppt&#xff0c;ppt一定要过两遍)。 注意:往年的经验贴&#xff0c;到此为止&#xff0c;全部作废&#xff0c;一个没考。千万不要只对着复习&#xff0c;SIFT没考&#x…...

【matplotlib】条形图及垂线显示小技巧 |一些有用参考帖子收集

最近在画图。一方面看论文看思路&#xff0c;一方面用数据跑图出论文雏形。 有些帖子写得很好&#xff0c;不记录的话下次还想看就只能随缘了。 帖子 博客&#xff1a;nxf_rabbit75 matplotlib技巧—9.共享坐标轴、创建多个subplot、调整横坐标、放置文本框、latext文字、平移…...

Go的bytes.Buffer

Go的bytes.Buffer 文章目录Go的bytes.Buffer一、bytes.Buffer 的基础知识二、bytes.Buffer类型的值&#xff0c;已读计数的作用三、bytes.Buffer的扩容策略四、bytes.Buffer的哪些方法会造成内容的泄露一、bytes.Buffer 的基础知识 与strings.Builder一样&#xff0c;bytes.Bu…...

k8s学习之路 | Day19 k8s 工作负载 Deployment(上)

文章目录1. Deployment 基础1.1 什么是 Deployment1.2 简单体验 Deployment1.3 Deployment 信息描述1.4 如何编写 Deployment2. Deployment 简单特性2.1 赋予 Pod 故障转移和自愈能力2.2 更新 Deployment2.3 回滚 Deployment2.4 暂停、恢复 Deployment 的上线过程2.5 Deploymen…...

php宝塔搭建部署实战六零导航页LyLme_Spage源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套php开发的六零导航页LyLme_Spage源码。感兴趣的朋友可以自行下载学习。 技术架构 PHP7.0 nginx mysql5.7 JS CSS HTMLcnetos7以上 宝塔面板 文字搭建教程 下载源码&#xff0c;宝塔添…...

SpringBoot (三) 整合数据库访问 jdbcTemplate、MyBatis

哈喽&#xff0c;大家好&#xff0c;我是有勇气的牛排&#xff08;全网同名&#xff09;&#x1f42e;&#x1f42e;&#x1f42e; 有问题的小伙伴欢迎在文末评论&#xff0c;点赞、收藏是对我最大的支持&#xff01;&#xff01;&#xff01;。 Spring Data了解下&#xff1…...

机器学习、数据挖掘和统计模式识别学习(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 机器学习是让计算机在没有明确编程的情况下采取行动的科学。在过去的十年中&#xff0c;机器学习为我们提供了自动驾驶汽车&…...

Java修饰符-ai生成

Java修饰符 Java的修饰符有哪几种 Java的修饰符有以下几种&#xff1a; 访问修饰符&#xff1a;public、protected、private和默认访问修饰符。 非访问修饰符&#xff1a;final、abstract、static、synchronized、volatile、transient、native、strictfp和Deprecated。 什么…...

kafka部署安装

kafka介绍 kafka是一个分布式的消息队列系统&#xff0c;适合离线和在线消费&#xff0c;扩展性好 kafka部署 安装包获取&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1y32yvZU-CAHBtbEfnHkJzQ 提取码&#xff1a;y9vb –来自百度网盘超级会员V5的分享 安装目录为…...

使用asio实现一个单线程异步的socket服务程序

文章目录前言代码前言 之前&#xff0c;我使用epoll实现过一个C的后端服务程序&#xff0c;见&#xff1a;从头开始实现一个留言板-README_c做一个留言板_大1234草的博客-CSDN博客 但是它不够简便&#xff0c;无法轻松的合并到其他代码中。并且&#xff0c;由于程序中使用epo…...

大型JAVA版云HIS医院管理系统源码 Saas应用+前后端分离+B/S架构

SaaS运维平台多集团多医院入驻强大的电子病历完整文档 有源码&#xff0c;有演示&#xff01; 云HIS系统技术栈&#xff1a; 1、前端框架&#xff1a;AngularNginx 2、后台框架&#xff1a;JavaSpring&#xff0c;SpringBoot&#xff0c;SpringMVC&#xff0c;SpringSecurity&…...

1 网关介绍

网关介绍 在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f;如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去调用。这样的话会产生很多问题&#xff0c;例如&a…...

Java中Scanner用法

Java中Scanner用法 Scanner可以实现程序和人的交互&#xff0c;用户可以利用键盘进行输入。 不同类型的输入&#xff1a; String ssc.next(); //接受字符串数据 System.out.println(s);int s1 sc.nextInt();//接受整型数据 System.out.println(s1);double s2 sc.nextDouble…...

malloc实现原理探究

2021年末面试蔚来汽车&#xff0c;面试官考察了malloc/free的实现机制。当时看过相关的文章&#xff0c;有一点印象&#xff0c;稍微说了一点东西&#xff0c;不过自己感到不满意。今天尝试研究malloc的实现细节&#xff0c;看了几篇博文&#xff0c;发现众说纷纭&#xff0c;且…...

Spring——整合junit4、junit5使用方法

spring需要创建spring容器&#xff0c;每次创建容器单元测试是测试单元代码junit4依赖<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-i…...

计算机网络的一些思考(待完善)

文章目录概念1. 缓存2. 备份&#xff08;副本&#xff09;3. 硬件和软件&#xff1a;4.端口5. 二进制协议vs文本协议6. 虚拟7.分布式8.广播域和冲突域的区别9本地地址协议1.CSMA/CD协议2.IP协议3.路由算法协议&#xff08;RIP&#xff0c;OSPF&#xff0c;BGP&#xff09;4.ARP…...

【第一章】谭浩强C语言课后习题答案

1.什么是程序?什么是程序设计? 程序:就是一组能识别和执行的指令,每一条指令使计算机执行特定的操作 程序设计:是指从确定任务到得到结果、写出文档的全过程 2.为什么需要计算机语言?高级语言有哪些特点? 为什么需要计算机语言:计算机语言解决了人和计算机交流是的…...