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

「数据结构」栈和队列

栈的基本概念

  1. 定义
    1. 栈是只允许在一端进行插入或删除操作的线性表
    2. 栈顶:线性表允许进行插入删除的那一端
    3. 栈底:固定的,不允许进行插入和删除的另一端
    4. 空栈:不含任何元素
    5. 特点:后进先出(LIFO)
  2. 基本操作
    1. InitStack(&S):初始化一个空栈S
    2. StackEmpty(S):判断一个栈是否为空,若栈S为空则返回true,否则返回false
    3. Push(&S,x):进栈,若栈S未满,则将x加入使之成为新栈顶
    4. Pop(&S,%=&x):出栈,若栈S非空,则用x返回栈顶元素
    5. GetTop(S,&x):读栈顶元素,若栈S非空,则用x返回栈顶元素
    6. DestroyStack(&S):销毁栈,并释放栈S占用的存储空间
  3. 卡特兰数:n个不同元素进栈,出栈元素的不同排列的个数为 1 n + 1 C 2 n n \frac{1}{n+1}C^n_{2n} n+11C2nn

栈的顺序存储结构

  1. 顺序栈的定义
#define MaxSize 10         //定义栈中元素的最大个数typedef struct{ElemType data[MaxSize];       //静态数组存放栈中元素int top;                      //栈顶元素
}SqStack;void testStack(){SqStack S;       //声明一个顺序栈(分配空间)//连续的存储空间大小为 MaxSize*sizeof(ElemType)
}
  1. 基本操作
#define MaxSize 10         //定义栈中元素的最大个数typedef struct{ElemType data[MaxSize];       //静态数组存放栈中元素int top;                      //栈顶元素
}SqStack;//初始化栈
void InitStack(SqStack &S){S.top = -1;                   //初始化栈顶指针
}//判栈空
bool StackEmpty(SqStack S){if(S.top == -1)      //栈空return true;else                 //栈不空return false;
}//新元素进栈
bool Push(SqStack &S, ElemType x){if(S.top == MaxSize - 1)        //栈满return false;S.top = S.top + 1;    //指针先加1S.data[S.top] = x;    //新元素入栈/*S.data[++S.top] = x;*/return true;
}//出栈
bool Pop(SqStack &x, ElemType &x){if(S.top == -1)          //栈空return false;x = S.data[S.top];       //先出栈S.top = S.top - 1;       //栈顶指针减1return true;/*x = S.data[S.top--];*///只是逻辑上的删除,数据依然残留在内存里
}//读栈顶元素
bool GetTop(SqStack S, ElemType &x){if(S.top == -1)return false;x = S.data[S.top];      //x记录栈顶元素return true; 
}void testStack(){SqStack S;       //声明一个顺序栈(分配空间)InitStack(S);//...
}
  1. 栈满条件:top==MaxSize
  2. 顺序栈的缺点:栈的大小不可变
  3. 共享栈
    1. 定义:利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸

栈的链式存储结构

与链表类似,入栈和出栈的操作都在链表的表头进行

队列

队列的概念

  1. 定义:队列是只允许在一端进行插入(入队),在另一端删除(出队)的线性表
  2. 队头:允许删除的一端
  3. 队尾:允许插入的一端
  4. 空队列:不含任何元素的空表
  5. 队列的特点:先进先出(FIFO)
  6. 队列的基本操作
    1. InitQueue(&Q): 初始化队列,构造一个空队列Q
    2. DestroyQueue(&Q): 销毁队列,并释放队列Q所占用的内存空间
    3. EnQueue(&Q, x): 入队,若队列Q未满,将x加入,使之成为新的队尾
    4. DeQueue(&Q, &x): 出队,若队列Q非空,删除队头元素,并用x返回
    5. GetHead(Q,&x): 读队头元素,若队列Q非空,则将队头元素赋值给x
    6. QueueEmpty(Q): 判队列空,若队列Q为空,则返回true,否则返回false

队列的顺序存储结构

  1. 队列的顺序实现
# define MaxSize 10;     //定义队列中元素的最大个数
typedef struct{ElemType data[MaxSize];   //用静态数组存放队列元素int front, rear;          //队头指针和队尾指针
}SqQueue;
  1. 初始化操作
//初始化队列
void InitQueue(SqQueue &Q){//初始化时,队头、队尾指针指向0Q.rear = Q.front = 0;
}// 判断队列是否为空
bool QueueEmpty(SqQueue 0){if(Q.rear == Q.front)    //队空条件return true;else return false;
}
  1. 入队操作
bool EnQueue(SqQueue &Q, ElemType x){if((Q.rear+1)%MaxSize == Q.front)    //队满return false;    //队满报错Q.data[Q.rear] = x;    //将x插入队尾Q.rear = (Q.rear + 1) % MaxSize;    //队尾指针加1取模return true;
}
  1. 出队操作
//出队,删除一个队头元素,用x返回
bool DeQueue(SqQueue &Q, ElemType &x){if(Q.rear == Q.front)              //队空报错return false;  x = Q.data[Q.front];Q.front = (Q.front + 1) % MaxSize; //队头指针后移动return true;
}
  1. 获得队头元素
bool GetHead(SqQueue &Q, ElemType &x){if(Q.rear == Q.front)              //队空报错return false;  x = Q.data[Q.front];return true;
}
  1. 判断队列已满/已空
    1. 方案一:牺牲一个存储单元(实现代码同1)
      1. 初始化时:rear=front=0;
      2. 队空条件:Q.rear==Q.front;
      3. 队满条件:(Q.rear+1)%MaxSize == Q.front
      4. 队列元素个数:(rear+MaxSize-front)%MaxSize;
    2. 方案二
      1. 实现
      #define MaxSize 10;     //定义队列中元素的最大个数
      typedef struct{ElemType data[MaxSize];   //用静态数组存放队列元素int front, rear;          //队头指针和队尾指针int size;
      }SqQueue;
      
      1. 初始化时
      rear=front=0;
      size=0;
      
      1. 插入成功:size++;
      2. 删除成功:size--;
      3. 队满条件:size==Maxsize;
      4. 队空条件:size==0;
    3. 方案三
      1. 实现
      #define MaxSize 10;     //定义队列中元素的最大个数
      typedef struct{ElemType data[MaxSize];   //用静态数组存放队列元素int front, rear;          //队头指针和队尾指针int tag;    //最近进行的是删除/插入
      }SqQueue;
      
      1. 初始化时
      rear=front=0;
      tag=0;
      
      1. 插入成功:tag=1;
      2. 删除成功:tag=0;
      3. 队满条件:rear==front&&tag==1;
      4. 队空条件:rear==front&&tag==0;

队列的链式存储结构

  1. 定义队列
typedef struct LinkNode{      //链式队列结点ElemType data;struct LinkNode *next;
}typedef struct{               //链式队列LinkNode *front, *rear;   //队列的队头和队尾指针
}LinkQueue;
  1. 初始化

    1. 带头结点
    void InitQueue(LinkQueue &Q){//初始化时,front、rear都指向头结点Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));Q.front -> next = NULL;
    }//判断队列是否为空
    bool IsEmpty(LinkQueue Q){if(Q.front == Q.rear)     //也可用 Q.front -> next == NULLreturn true;elsereturn false;
    }
    
    1. 不带头结点
    void InitQueue(LinkQueue &Q){//初始化时,front、rear都指向NULLQ.front = NULL;Q.rear = NULL;
    }//判断队列是否为空
    bool IsEmpty(LinkQueue Q){if(Q.front == NULL)return true;elsereturn false;
    }
    
  2. 入队

    1. 带头结点
    //新元素入队 (表尾进行)
    void EnQueue(LinkQueue &Q, ElemType x){LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode)); //申请一个新结点s->data = x;s->next = NULL;     //s作为最后一个结点,指针域指向NULLQ.rear->next = s;   //新结点插入到当前的rear之后Q.rear = s;         //表尾指针指向新的表尾
    }
    
    1. 不带头结点
    //新元素入队
    void EnQueue(LinkQueue &Q, ElemType x){LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode)); //申请一个新结点s->data = x;s->next = NULL;if(Q.front==NULL){    //在空队列中插入第一个元素Q.front=s;    //修改队头队尾指针Q.rear=s;}else{Q.rear->next=s;    //新结点插入到rear结点之后Q.rear=s;    //修改rear指针}
    }
    
  3. 出队

    1. 带头结点
    //队头元素出队
    bool DeQueue(LinkQueue &Q, ElemType &x){if(Q.front == Q.rear)return false;                    //空队LinkNode *p = Q.front->next;    //p指针指向即将删除的结点x = p->data;Q.front->next = p->next;             //修改头结点的next指针if(Q.rear == p)                      //此次是最后一个结点出队Q.rear = Q.front;                //修改rear指针free(p);                             //释放结点空间return true;
    }
    
    1. 不带头结点
    //队头元素出队
    bool DeQueue(LinkQueue &Q, ElemType &x){if(Q.front == Q.rear)return false;                    //空队LinkNode *p = Q.front;    //p指针指向即将删除的结点x = p->data;Q.front = p->next;             //修改头结点的next指针if(Q.rear == p){    //此次是最后一个结点出队Q.rear==NULL:Q.front==NULL;}                      free(p);     //释放结点空间return true;
    }
    

双端队列

  1. 定义:只允许从两端插入、两端删除的线性表
    1. 输入受限的双端队列:允许一端插入,两端删除的线性表
    2. 输出受限的双端队列:允许两端插入,一端删除的线性表

栈和队列的应用

栈在括号匹配中的应用

#define MaxSize 10   typedef struct{char data[MaxSize];int top;
} SqStack;//初始化栈
InitStack(SqStack &S)//判断栈是否为空
bool StackEmpty(SqStack &S)//新元素入栈
bool Push(SqStack &S, char x)//栈顶元素出栈,用x返回
bool Pop(SqStack &S, char &x)bool bracketCheck(char str[], int length){SqStack S;      //声明InitStack(S);   //初始化栈for(int i=0; i<length; i++){if(str[i] == '(' || str[i] == '[' || str[i] == '{'){Push(S, str[i]);       //扫描到左括号,入栈}else{if(StackEmpty(S))      //扫描到右括号,且当前栈空return false;      //匹配失败char topElem;          //存储栈顶元素Pop(S, topElem);       //栈顶元素出栈if(str[i] == ')' && topElem != '(' )return false;if(str[i] == ']' && topElem != '[' )return false;if(str[i] == '}' && topElem != '{' )return false;       }}StackEmpty(S); //栈空说明匹配成功
}

栈在表达式值中的应用

中缀表达式
(需要界限符)

  1. 规则:运算符在两个操作数中间
    1. a + b
    2. a + b - c
    3. a + b - c*d

后缀表达式 (逆波兰表达式)

  1. 规则:运算符在两个操作数后面
    1. a b +
    2. ab+ c - / a bc- +
    3. ab+ cd* -
  2. 中缀表达式转后缀表达式
    1. 确定中缀表达式中各个运算符的运算顺序
    2. 选择下一个运算符,按照[左操作数 右操作数 运算符]的方式组合成一个新的操作数
    3. 如果还有运算符没被处理,继续步骤2

“左优先”原则: 只要左边的运算符能先计算,就优先算左边的 (保证运算顺序唯一)

  1. 用栈实现中缀表达式转后缀表达式
    1. 初始化一个栈,用于保存暂时还不能确定运算顺序的运算符。从左到右处理各个元素,直到末尾。可能遇到三种情况
      1. 遇到操作数: 直接加入后缀表达式
      2. 遇到界限符: 遇到 ‘(’ 直接入栈; 遇到 ‘)’ 则依次弹出栈内运算符并加入后缀表达式,直到弹出 ‘(’ 为止。注意: ‘(’ 不加入后缀表达式
      3. 遇到运算符: 依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,若碰到 ‘(’ 或栈空则停止。之后再把当前运算符入栈
    2. 按上述方法处理完所有字符后,将栈中剩余运算符依次弹出,并加入后缀表达式
  2. 后缀表达式的计算:从左往右扫描,每遇到一个运算符,就让运算符前面最近的两个操作数执行对应的运算,合体为一个操作数
  3. 用栈实现后缀表达式的计算(栈用来存放当前暂时不能确定运算次序的操作数)
    1. 从左往后扫描下一个元素,直到处理完所有元素
    2. 若扫描到操作数,则压入栈,并回到步骤1;否则执行步骤3
    3. 若扫描到运算符,则弹出两个栈顶元素,执行相应的运算,运算结果压回栈顶,回到步骤1

先出栈的是“右操作数”

前缀表达式 (波兰表达式)

  1. 规则:运算符在两个操作数前面
      • a b
    1. +ab c
      • +ab *cd
  2. 中缀表达式转前缀表达式
    1. 确定中缀表达式中各个运算符的运算顺序
    2. 选择下一个运算符,按照[运算符 左操作数 右操作数]的方式组合成一个新的操作数
    3. 如果还有运算符没被处理,就继续执行步骤2

“右优先”原则: 只要右边的运算符能先计算,就优先算右边的;

  1. 用栈实现前缀表达式的计算
    1. 从右往左扫描下一个元素,直到处理完所有元素
    2. 若扫描到操作数则压入栈,并回到步骤1,否则执行步骤3
    3. 若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到步骤1;

先出栈的是“左操作数”

4.中缀表达式的计算(用栈实现):两个算法的结合: 中缀转后缀 + 后缀表达式的求值
1. 初始化两个栈,操作数栈运算符栈
2. 若扫描到操作数,压入操作数栈
3. 若扫描到运算符或界限符,则按照“中缀转后缀”相同的逻辑压入运算符栈 (期间也会弹出运算符,每当弹出一个运算符时,就需要再弹出两个操作数栈的栈项元素并执行相应运算,运算结果再压回操作数栈)

栈在递归中的应用

  1. 函数调用的特点:最后被调用的函数最先执行结束(LIFO)
  2. 函数调用时,需要用一个栈存储
    1. 调用返回地址
    2. 实参
    3. 局部变量
  3. 递归调用时,函数调用栈称为 “递归工作栈”
    1. 每进入一层递归,就将递归调用所需信息压入栈顶
    2. 每退出一层递归,就从栈顶弹出相应信息
    3. 缺点: 太多层递归可能回导致栈溢出

数组和特殊矩阵

数组的定义

数组是由n(n>=1)个相同类型的数据元素构成的有限序列,每个数据元素称为一个数组元素,每个元素在n个线性关系中的序号称为该元素的下标,下标的取值范围称为数组的维界

数组的存储结构

  1. 一维数组
    1. 各数组元素大小相同,物理上连续存放
    2. 数组下标:默认从0开始
    3. 数组元素 a[i] 的存放地址 = L O C + i ∗ s i z e o f ( E l e m T y p e ) LOC + i * sizeof(ElemType) LOC+isizeof(ElemType)
      1. LOC为数组起始地址
  2. 二维数组
    1. 行优先/列优先存储优点:实现随机存储
    2. M行N列的二维数组 b[M][N] 中,b[i][j]的存储地址:
      1. 行优先存储: L O C + ( i × N + j ) × s i z e o f ( E l e m T y p e ) LOC + (i×N + j) × sizeof(ElemType) LOC+(i×N+j)×sizeof(ElemType)
      2. 列优先存储: L O C + ( j × M + i ) × s i z e o f ( E l e m T y p e ) LOC + (j×M + i) × sizeof(ElemType) LOC+(j×M+i)×sizeof(ElemType)
  3. 普通矩阵的存储:使用二维数组存储

描述矩阵元素时,行、列号通常从1开始
描述数组时,通常下标从 0 开始

特殊矩阵的压缩存储

矩阵的压缩存储:为多个相同的非零元素只分配一个存储空间;对零元素不分配空间。

  1. 对称矩阵
    1. 若n 阶方阵中任意一个元素 a i , j a_{i,j} ai,j都有 a i , j = a j , i a_{i,j}=a_{j,i} ai,j=aj,i则该矩阵为对称矩阵
    2. 策略:只存储主对角线+下三角区;按行优先原则将各元素存入一维数组中
    3. 数组大小: n ( n + 1 ) 2 \frac{n(n+1)}{2} 2n(n+1)
    4. 元素下标对应关系:k为 a i , j a_{i,j} ai,j在一维数组中的下标

k = { i ( i − 1 ) 2 + j − 1 , i ≥ j ( 下三角区和主对角线元素 ) j ( j − 1 ) 2 + i − 1 , i < j ( 上三角区元素 a i , j = a j , i ) k= \left\{ \begin{array}{l} \frac{i(i-1)}{2}+j-1, \quad i \ge j \quad (下三角区和主对角线元素) \\ \frac{j(j-1)}{2}+i-1, \quad i<j \quad (上三角区元素a_{i,j}=a_{j,i}) \ \end{array} \right. k={2i(i1)+j1,ij(下三角区和主对角线元素)2j(j1)+i1,i<j(上三角区元素ai,j=aj,i) 

  1. 三角矩阵
    1. 以主对角线划分,三角矩阵有上(下)三角两种。上(下)三角矩阵的下(上)三角(不含主对角线)中的元素均为常数。在大多数情况下,三角矩阵常数为零
    2. 策略:按行优先原则将元素存入一维数组中(同对称矩阵)。并在最后一个位置存储常量
    3. 元素下标对应关系:k为 a i , j a_{i,j} ai,j在一维数组中的下标

k = { i ( i − 1 ) 2 + j − 1 , i ≥ j ( 下三角区和主对角线元素 ) n ( n + 1 ) 2 , i < j ( 上三角区元素 a i , j = a j , i ) k= \left\{ \begin{array}{l} \frac{i(i-1)}{2}+j-1, \quad i \ge j \quad (下三角区和主对角线元素) \\ \frac{n(n+1)}{2}, \quad i<j \quad (上三角区元素a_{i,j}=a_{j,i}) \ \end{array} \right. k={2i(i1)+j1,ij(下三角区和主对角线元素)2n(n+1),i<j(上三角区元素ai,j=aj,i) 
3. 三对角矩阵(带状矩阵)
1. 当 ∣ i − j ∣ > 1 |i-j|>1 ij>1时,有 a i , j = 0 ( 1 ≤ i , j ≤ n ) a_{i,j}=0 (1 \leq i,j \leq n) ai,j=0(1i,jn)
2. 策略:按行优先(或列优先) 原则,只存储带状部分
3. 元素下标对应关系:k为 a i , j a_{i,j} ai,j在一维数组中的下标 k=2i+j-3

稀疏矩阵

  1. 非零元系远远少于矩阵元素的个数
  2. 策略
    1. 顺序存储——三元组<行,列,值>
      1. 会失去随机存取的特性
    2. 十字链表法

相关文章:

「数据结构」栈和队列

栈 栈的基本概念 定义 栈是只允许在一端进行插入或删除操作的线性表栈顶&#xff1a;线性表允许进行插入删除的那一端栈底&#xff1a;固定的&#xff0c;不允许进行插入和删除的另一端空栈&#xff1a;不含任何元素特点&#xff1a;后进先出&#xff08;LIFO&#xff09; 基…...

【机器学习笔记】5 机器学习实践

数据集划分 子集划分 训练集&#xff08;Training Set&#xff09;&#xff1a;帮助我们训练模型&#xff0c;简单的说就是通过训练集的数据让我们确定拟合曲线的参数。 验证集&#xff08;Validation Set&#xff09;&#xff1a;也叫做开发集&#xff08; Dev Set &#xf…...

C++ //练习 7.5 在你的Person类中提供一些操作使其能够返回姓名和住址。这些函数是否应该是const的呢?解释原因。

C Primer&#xff08;第5版&#xff09; 练习 7.5 练习 7.5 在你的Person类中提供一些操作使其能够返回姓名和住址。这些函数是否应该是const的呢&#xff1f;解释原因。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 解释 姓名大概…...

python系统学习Day2

section3 python Foudamentals part one&#xff1a;data types and variables 数据类型&#xff1a;整数、浮点数、字符串、布尔值、空值 #整型&#xff0c;没有大小限制 >>>9 / 3 #3.0 >>>10 // 3 #3 地板除 >>>10 % 3 #1 取余#浮点型&#xff…...

学习笔记——ENM模拟

学习笔记——ENM模拟 文章目录 前言一、文献一1. 材料与方法1.1. 大致概念1.2. 生态模型的构建1.2.1. 数据来源&#xff1a;1.2.2. 数据处理&#xff1a;1.2.3. 模型参数优化&#xff1a; 1.3. 适生情况预测1.3.1. 预测模型构建1.3.2. 适生区划分 1.4. 模型的评估与验证 2. 结果…...

数值类型的运算方式总结

提纲1&#xff1a;常见的位运算使用场景 提纲2&#xff1a;整数类型运算时的类型溢出问题&#xff0c;产生原因以及解决办法 提纲3&#xff1a;浮点类型运算时的精度丢失问题&#xff0c;产生原因以及解决办法 数值类型&#xff08;6种&#xff09;分为&#xff1a; 整型&…...

【Redis快速入门】Redis三种集群搭建配置(主从集群、哨兵集群、分片集群)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…...

[嵌入式系统-14]:常见实时嵌入式操作系统比较:RT-Thread、uC/OS-II和FreeRTOS、Linux

目录 一、实时嵌入式操作系统 1.1 概述 1.2 什么“实时” 1.3 什么是硬实时和软实时 1.4 什么是嵌入式 1.5 什么操作系统 二、常见重量级操作系统 三、常见轻量级嵌入式操作系统 3.1 概述 3.2 FreeRTOS 3.3 uC/OS-II 3.4 RT-Thread 3.5 RT-Thread、uC/OS-II、Free…...

基于AI Agent探讨:安全领域下的AI应用范式

先说观点&#xff1a;关于AI应用&#xff0c;通常都会聊准召。但在安全等模糊标准的场景下&#xff0c;事实上不存在准召的定义。因此&#xff0c;AI的目标应该是尽可能的“像人”。而想要评价有多“像人”&#xff0c;就先需要将人的工作数字化。而AI Agent是能够将数字化、自…...

Stable Diffusion 模型下载:ToonYou(平涂卡通)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十...

机器学习:分类决策树(Python)

一、各种熵的计算 entropy_utils.py import numpy as np # 数值计算 import math # 标量数据的计算class EntropyUtils:"""决策树中各种熵的计算&#xff0c;包括信息熵、信息增益、信息增益率、基尼指数。统一要求&#xff1a;按照信息增益最大、信息增益率…...

红队打靶练习:HACK ME PLEASE: 1

信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:69:c7:bf, IPv4: 192.168.61.128 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.61.2 00:50:56:f0:df:20 …...

《VulnHub》GoldenEye:1

title: 《VulnHub》GoldenEye&#xff1a;1 date: 2024-02-16 14:53:49 updated: 2024-02-16 15:08:49 categories: WriteUp&#xff1a;Cyber-Range excerpt: 主机发现、目标信息扫描、源码 js 文件泄露敏感信息、hydra 爆破邮件服务&#xff08;pop3&#xff09;、邮件泄露敏…...

html的表格标签

html的表格标签 table标签:表示整个表格tr:表示表格的一行td:表示一个单元格th:表示表头单元格.会居中加粗thead:表格的头部区域 (注意和th区分,范围是比th要大的).tbody:表格得到主体区域. table包含tr , tr包含td或者th. 表格标签有一些属性&#xff0c;可以用于设置大小边…...

蓝桥杯(Web大学组)2022省赛真题:展开你的扇子

思路&#xff1a; transform-origin: center bottom;使盒子旋转时&#xff0c;以底部的中心为坐标原点&#xff08;题目已给出&#xff09; 对每个盒子使用transform: rotate();实现旋转 笔记&#xff1a; 设置悬浮旋转时&#xff0c; #box div:hover #item6{ } 为什…...

复习基础知识1

局部变量 写程序时&#xff0c;程序员经常会用到局部变量 汇编中寄存器、栈&#xff0c;可写区段、堆&#xff0c;函数的局部变量该存在哪里呢&#xff1f; 注意&#xff1a;局部变量有易失性 一旦函数返回&#xff0c;则所有局部变量会失效。 考虑到这种特性&#xff0c;人们…...

java8-用流收集数据-6

本章内容口用co1lectors类创建和使用收集器 口将数据流归约为一个值 口汇总:归约的特殊情况 数据分组和分区口 口 开发自己的自定义收集器 我们在前一章中学到&#xff0c;流可以用类似于数据库的操作帮助你处理集合。你可以把Java8的流看作花哨又懒惰的数据集迭代器。它们…...

[前端开发] JavaScript基础知识 [上]

下篇&#xff1a;JavaScript基础知识 [下] JavaScript基础知识 [上] 引言语句、标识符和变量JavaScript引入注释与输出数据类型运算符条件语句与循环语句 引言 JavaScript是一种广泛应用于网页开发的脚本语言&#xff0c;具有重要的前端开发和部分后端开发的应用。通过JavaSc…...

初识Qt | 从安装到编写Hello World程序

文章目录 1.前端开发简单分类2.Qt的简单介绍3.Qt的安装和环境配置4.创建简单的Qt项目 1.前端开发简单分类 前端开发&#xff0c;这里是一个广义的概念&#xff0c;不单指网页开发&#xff0c;它的常见分类 网页开发&#xff1a;前端开发的主要领域&#xff0c;使用HTML、CSS …...

机器学习:过拟合和欠拟合的介绍与解决方法

过拟合和欠拟合的表现和解决方法。 其实除了欠拟合和过拟合&#xff0c;还有一种是适度拟合&#xff0c;适度拟合就是我们模型训练想要达到的状态&#xff0c;不过适度拟合这个词平时真的好少见。 过拟合 过拟合的表现 模型在训练集上的表现非常好&#xff0c;但是在测试集…...

变分自编码器(VAE)PyTorch Lightning 实现

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…...

设备驱动开发_1

可加载模块如何工作的 主要内容 描述可加载模块优势使用模块命令效率使用和定义模块密钥和模块工作1 描述可加载模块优势 开发周期优势: 静态模块在/boot下的vmlinuz中,需要配置、编译、重启。 开发周期长。 LKM 不需要重启。 开发周期优于静态模块。 2 使用模块命令效率…...

C语言位域(Bit Fields)知识点精要解析

在C语言中&#xff0c;位域&#xff08;Bit Field&#xff09;是一种独特的数据结构特性&#xff0c;它允许程序员在结构体&#xff08;struct&#xff09;中定义成员变量&#xff0c;并精确指定其占用的位数。通过使用位域&#xff0c;我们可以更高效地利用存储空间&#xff0…...

离散数学——图论(笔记及思维导图)

离散数学——图论&#xff08;笔记及思维导图&#xff09; 目录 大纲 内容 参考 大纲 内容 参考 笔记来自【电子科大】离散数学 王丽杰...

opencv图像像素的读写操作

void QuickDemo::pixel_visit_demo(Mat & image) {int w image.cols;//宽度int h image.rows;//高度int dims image.channels();//通道数 图像为灰度dims等于一 图像为彩色时dims等于三 for (int row 0; row < h; row) {for (int col 0; col < w; col) {if…...

Java学习第十四节之冒泡排序

冒泡排序 package array;import java.util.Arrays;//冒泡排序 //1.比较数组中&#xff0c;两个相邻的元素&#xff0c;如果第一个数比第二个数大&#xff0c;我们就交换他们的位置 //2.每一次比较&#xff0c;都会产生出一个最大&#xff0c;或者最小的数字 //3.下一轮则可以少…...

第1章 计算机网络体系结构-1.1计算机网络概述

1.1.1计算机网络概念 计算机网络是将一个分散的&#xff0c;具有独立功能的计算机系统通过通信设备与路线连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统。(计算机网络就是一些互连的&#xff0c;自治的计算机系统的集合) 1.1.2计算机网络的组成 从不同角…...

蓝桥杯:C++排序

排序 排序和排列是算法题目常见的基本算法。几乎每次蓝桥杯软件类大赛都有题目会用到排序或排列。常见的排序算法如下。 第(3)种排序算法不是基于比较的&#xff0c;而是对数值按位划分&#xff0c;按照以空间换取时间的思路来排序。看起来它们的复杂度更好&#xff0c;但实际…...

数据结构-堆

1.容器 容器用于容纳元素集合&#xff0c;并对元素集合进行管理和维护&#xff0e; 传统意义上的管理和维护就是&#xff1a;增&#xff0c;删&#xff0c;改&#xff0c;查&#xff0e; 我们分析每种类型容器时&#xff0c;主要分析其增&#xff0c;删&#xff0c;改&#xff…...

奔跑吧小恐龙(Java)

前言 Google浏览器内含了一个小彩蛋当没有网络连接时&#xff0c;浏览器会弹出一个小恐龙&#xff0c;当我们点击它时游戏就会开始进行&#xff0c;大家也可以玩一下试试&#xff0c;网址&#xff1a;恐龙快跑 - 霸王龙游戏. (ur1.fun) 今天我们也可以用Java来简单的实现一下这…...

Ubuntu 1804 And Above Coredump Settings

查看 coredump 是否开启 # 查询&#xff0c; 0 未开启&#xff0c; unlimited 开启 xiaoUbuntu:/var/core$ ulimit -c 0# 开启 xiaoUbuntu:/var/core$ ulimit -c unlimited查看 coredump 保存路径 默认情况下&#xff0c;Ubuntu 使用 apport 服务处理 coredump 文件&#xff…...

docker 2:安装

docker 2&#xff1a;安装 ‍ ubuntu 安装 docker sudo apt install docker.io‍ 把当前用户放进 docker 用户组&#xff0c;避免每次运行 docker 命都要使用 sudo​ 或者 root​ 权限。 sudo usermod -aG docker $USER​id $USER ​看到用户已加入 docker 组 ​​ ‍ …...

LeetCode Python - 19.删除链表的倒数第N个结点

目录 题目答案运行结果 题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&a…...

Spring Boot 笔记 005 环境搭建

1.1 创建数据库和表&#xff08;略&#xff09; 2.1 创建Maven工程 2.2 补齐resource文件夹和application.yml文件 2.3 porn.xml中引入web,mybatis,mysql等依赖 2.3.1 引入springboot parent 2.3.2 删除junit 依赖--不能删&#xff0c;删了会报错 2.3.3 引入spring web依赖…...

【解决(几乎)任何机器学习问题】:超参数优化篇(超详细)

这篇文章相当长&#xff0c;您可以添加至收藏夹&#xff0c;以便在后续有空时候悠闲地阅读。 有了优秀的模型&#xff0c;就有了优化超参数以获得最佳得分模型的难题。那么&#xff0c;什么是超参数优化呢&#xff1f;假设您的机器学习项⽬有⼀个简单的流程。有⼀个数据集&…...

面试计算机网络框架八股文十问十答第七期

面试计算机网络框架八股文十问十答第七期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;UDP协议为什么不可…...

Codeforces Round 926 (Div. 2)

A. Sasha and the Beautiful Array&#xff08;模拟&#xff09; 思路 最大值减去最小值 #include<iostream> #include<algorithm> using namespace std; const int N 110; int a[N];int main(){int t, n;cin>>t;while(t--){cin>>n;for(int i 0; i…...

构建智慧交通平台:架构设计与实现

随着城市交通的不断发展和智能化技术的迅速进步&#xff0c;智慧交通平台作为提升城市交通管理效率和水平的重要手段备受关注。本文将探讨如何设计和实现智慧交通平台的系统架构&#xff0c;以应对日益增长的城市交通需求&#xff0c;并提高交通管理的智能化水平。 ### 1. 智慧…...

移动端设置position: fixed;固定定位,底部出现一条缝隙,不知原因,欢迎探讨!!!

1、问题 在父盒子中有一个子盒子&#xff0c;父盒子加了固定定位&#xff0c;需要子盒子上下都有要边距&#xff0c;用margin或者padding挤开时&#xff0c;会出现缝隙是子盒子背景颜色的。 测试过了&#xff0c;有些手机型号有&#xff0c;有些没有&#xff0c;微信小程序同移…...

有关网络安全的课程学习网页

1.思科网络学院 免费学习skillsforall的课程 课程链接&#xff1a;Introduction to Cybersecurity by Cisco: Free Online Course (skillsforall.com) 2.斯坦福大学计算机和网络安全基础 该证书对于初学者来说最有价值&#xff0c;它由最著名的大学之一斯坦福大学提供。您可…...

计算机网络-面试题

一、基础 1、网络编程 网络编程的本质是多台计算机之间的数据交换存在问题 如何准确的定位网络上一台或多台主机如何进行可靠传输2、网络协议 在计算机网络有序的交换数据,就必须遵守一些事先约定好的规则,比如交换数据的格式、是否需要发送一个应答信息。这些规则被称为网络…...

C++虚函数

C虚函数 在C中&#xff0c;虚函数&#xff08;Virtual Function&#xff09;是一个使用关键字virtual声明的成员函数&#xff0c;它在基类中被声明&#xff0c;以便在任何派生类中被重写&#xff08;Override&#xff09;。使用虚函数的目的是实现多态性——一种允许使用基类指…...

MySQL数据库基础(二):MySQL数据库介绍

文章目录 MySQL数据库介绍 一、MySQL介绍 二、MySQL的特点 三、MySQL版本 四、MySQL数据库下载与安装 1、下载 2、安装 五、添加环境变量&#xff08;Windows&#xff09; 六、检测环境变量是否配置成功 MySQL数据库介绍 一、MySQL介绍 MySQL是一个关系型数据库管理…...

常用文件命令

文章目录 文件命令文件内容查看catnlmoreless&#xff08;more的plus版&#xff09;headtailod 文件属性操作用户权限常见的权限chownchmodchgrpumask 隐藏属性常见的隐藏属性lsattrchattr 查找文件查看文件类型查找文件位置whichwhereislocatefind 文件操作&#xff08;复制、…...

在屏蔽任何FRP环境下从零开始搭建安全的FRP内网穿透服务

背景 本人目前在境外某大学读博&#xff0c;校园网屏蔽了所有内网穿透的工具的数据包和IP访问&#xff0c;为了实现在家也能远程访问服务器&#xff0c;就不得不先开个学校VPN&#xff0c;再登陆。我们实验室还需要访问另一个大学的服务器&#xff0c;每次我都要去找另一个大学…...

OpenGL-ES 学习(1)---- AlphaBlend

AlphaBlend OpenGL-ES 混合本质上是将 2 个片元的颜色进行调和(一般是求和操作)&#xff0c;产生一个新的颜色 OpenGL ES 混合发生在片元通过各项测试之后&#xff0c;准备进入帧缓冲区的片元和原有的片元按照特定比例加权计算出最终片元的颜色值&#xff0c;不再是新&#xf…...

Python 函数的学习笔记

Python 函数的学习笔记 0. Python 函数的概要说明1. 自定义函数示例2. 匿名函数示例3. 内置函数示例3-1. filter() 示例3-2. map() 示例3-3. reduce() 示例 4. 可变长参数*args和**kwargs示例4-1. *args&#xff08;Positional Variadic Arguments&#xff09;4-2. **kwargs&am…...

详解 Redis 实现数据去重

✨✨ 欢迎大家来到喔的嘛呀的博客✨✨ &#x1f388;&#x1f388;希望这篇博客对大家能有帮助&#x1f388;&#x1f388; 目录 言 一. Redis去重原理 1. Redis Set 数据结构 2. 基于 Set 实现数据去重 3. 代码示例 4. 总结 …...

FreeRTOS 延迟中断处理

采用二值信号量同步 二值信号量可以在某个特殊的中断发生时&#xff0c;让任务解除阻塞&#xff0c;相当于让任务与中断 同步。这样就可以让中断事件处理量大的工作在同步任务中完成&#xff0c;中断服务例程(ISR) 中只是快速处理少部份工作。如此&#xff0c;中断处理可以说是…...

计网体系结构

计算机网络的概述 概念 网络&#xff1a;网状类的东西或系统。 计算机网络&#xff1a;是一个将分散的、具有独立性功能的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统。即计算机网络是互连(通过通信链路互连…...