数据结构(学习)2024.8.8(栈,队列)
今天学习的是线性表里面的栈和队列
链表的相关知识可以查看http://t.csdnimg.cn/NX464
顺序表的相关知识可以查看http://t.csdnimg.cn/5IMAZ
目录
栈
栈的定义
栈的特点
顺序栈
结构体
顺序栈的相关操作案例
链式栈
结构体
链式栈的相关操作案例
总结
队列
队列的定义
队列的特点
顺序队列(又称为循环队列)
结构体
顺序队列的相关操作案例
链式队列
结构体
链式队列的相关操作案例
栈
栈的定义
只能在一端进行插入和删除操作的线性表(又称为堆栈),进行插入和删除操作的一端称为栈顶,另一端称为栈底。
栈的特点
先进后出 FILO first in last out LIFO
顺序栈
1.逻辑结构:线性结构
2.存储结构:顺序存储
3.操作:入栈、出栈
结构体
typedef struct seqstack
{
int *data; // 指向栈的存储位置
int maxlen; // 保存栈的最大长度
int top; // 称为栈针,用的时候,心里面可以将按照顺序表里的last来使用, top 始终代表当前栈内最后一个有效元素的下标
} seqstack_t;
顺序栈的相关操作案例
头文件seqstack.h:
#ifndef _SEQSTACK_H_
#define _SEQSTACK_H_
#include <stdio.h>
#include <stdlib.h>
typedef struct seqstack
{int *data; // 指向栈的存储位置int maxlen; // 保存栈的最大长度int top; // 称为栈针,用的时候,心里面可以将按照顺序表里的last来使用// top 始终代表当前栈内最后一个有效元素的下标
} seqstack_t;
// 1.创建一个空的栈
seqstack_t *CreateEpSeqStack(int len); // len代表的是创建栈的时候的最大长度
// 2.判断是否为满,满返回1 未满返回0
int IsFullSeqStack(seqstack_t *p);
// 3.入栈
int PushStack(seqstack_t *p, int data); // data代表入栈的数据
// 4.判断栈是否为空
int IsEpSeqStack(seqstack_t *p);
// 5.出栈
int PopSeqStack(seqstack_t *p);
// 6. 清空栈
void ClearSeqStack(seqstack_t *p);
// 7. 获取栈顶数据(注意不是出栈操作,如果出栈,相当于删除了栈顶数据,只是将栈顶的数据获取到,不需要移动栈针)
int GetTopSeqStack(seqstack_t *p);
// 8. 求栈的长度
int LengthSeqStack(seqstack_t *p);
#endif
顺序栈函数seqstack.c:
#include "seqstack.h"// 1.创建一个空的栈
seqstack_t *CreateEpSeqStack(int len) // len代表的是创建栈的时候的最大长度
{// 1.开辟一个结构体类型大小的空间seqstack_t *p = (seqstack_t *)malloc(sizeof(seqstack_t));if (p == NULL){perror("CreateEpSeqStack函数创建结构体失败");return NULL;}// 2.初始化p->top = -1;p->maxlen = len;p->data = (int *)malloc(len * sizeof(int));if (p->data == NULL){perror("CreateEpSeqStack函数创建数据空间失败");free(p);p = NULL;return NULL;}return p;
}// 2.判断是否为满,满返回1 未满返回0
int IsFullSeqStack(seqstack_t *p)
{return p->top == p->maxlen - 1;
}// 3.入栈
int PushStack(seqstack_t *p, int data) // data代表入栈的数据
{// 1.容错判断(判满)if (IsFullSeqStack(p)){perror("PushStack函数出错\n");return -1;}// 2.移动指针p->top++;// 3.入栈p->data[p->top] = data;return 0;
}// 4.判断栈是否为空
int IsEpSeqStack(seqstack_t *p)
{return p->top == -1;
}// 5.出栈
int PopSeqStack(seqstack_t *p)
{// 1.容错判断(判空)if (IsEpSeqStack(p)){perror("PopSeqStack函数出错\n");return -1;}// 2.移动指针p->top--;// 3.出栈数据return p->data[p->top + 1];
}// 6. 清空栈
void ClearSeqStack(seqstack_t *p)
{p->top = -1;
}// 7. 获取栈顶数据(注意不是出栈操作,如果出栈,相当于删除了栈顶数据,只是将栈顶的数据获取到,不需要移动栈针)
int GetTopSeqStack(seqstack_t *p)
{while (!IsEpSeqStack(p)){return p->data[p->top];}return -1;
}// 8. 求栈的长度
int LengthSeqStack(seqstack_t *p)
{return p->top + 1;
}
主函数main.c:
#include "seqstack.h"int main(int argc, char const *argv[])
{int data;seqstack_t *p = CreateEpSeqStack(5);PushStack(p, 1);PushStack(p, 2);PushStack(p, 3);printf("目前栈里的数据为:\n");for (int i = 0; i < LengthSeqStack(p); i++){printf("%d ", GetTopSeqStack(p));}printf("\n");printf("请输入你要插入的数据:\n");scanf("%d", &data);PushStack(p, data);printf("出栈操作:\n");while (!IsEpSeqStack(p)){printf("出栈的数据为:%d ", PopSeqStack(p));}printf("\n");free(p->data);p->data = NULL;free(p);p = NULL;return 0;
}
链式栈
1.逻辑结构:线性结构
2.存储结构:链式存储
3.操作:入栈、出栈
结构体
typedef struct linkstack
{
datatype data; // 数据域
struct linkstack *next; // 指针域
} linkstack_t;
链式栈的相关操作案例
头文件linkstack.h:
#ifndef _LINKSTACK_H_
#define _LINKSTACK_H_
#include <stdio.h>
#include <stdlib.h>
// 入栈和出栈只在第一个节点位置操作
typedef int datatype;
typedef struct linkstack
{datatype data; // 数据域struct linkstack *next; // 指针域
} linkstack_t;// 1.创建一个空的栈
void CreateEpLinkStack(linkstack_t **ptop);
// 2.入栈 data是入栈的数据
// 参数上之所以采用二级指针,因为我们要随着入栈添加新的节点作为头,top需要永远指向当前链表的头,
// 那么修改main函数中的top,我们采用地址传递
int PushLinkStack(linkstack_t **ptop, datatype data);
// 3.判断栈是否为空
int IsEpLinkStack(linkstack_t *top);
// 4.出栈
datatype PopLinkStack(linkstack_t **ptop);
// 5.清空栈
void ClearLinkStack(linkstack_t **ptop); // 用二级指针,是因为清空后需要将main函数中的top变为NULL
// 6.求栈的长度
int LengthLinkStack(linkstack_t *top); // 用一级指针,是因为我只是求长度,不需要修改main函数中top指针的指向
// 7.获取栈顶数据,不是出栈,不需要移动main函数中的top,所以用一级指针
datatype GetTopLinkStack(linkstack_t *top);
#endif
链式栈函数linkstack.c:
#include "linkstack.h"// 1.创建一个空的栈
void CreateEpLinkStack(linkstack_t **ptop)
{*ptop = NULL;
}// 2.入栈
// data是入栈的数据
// 参数上之所以采用二级指针,因为我们要随着入栈添加新的节点作为头,top需要永远指向当前链表的头,那么修改main函数中的top,我们采用地址传递
int PushLinkStack(linkstack_t **ptop, datatype data)
{// 1.创建一个新节点,并初始化linkstack_t *pnew = (linkstack_t *)malloc(sizeof(linkstack_t));if (pnew == NULL){perror("PushLinkStack函数出错\n");return -1;}pnew->data = data;pnew->next = NULL;// 2.将新节点插到无头单向链表中pnew->next = *ptop;// 3.移动栈针,栈针永远指向无头单向链表的第一个节点*ptop = pnew;return 0;
}// 3.判断栈是否为空
int IsEpLinkStack(linkstack_t *top)
{return top == NULL;
}// 4.出栈 *ptop-->top
datatype PopLinkStack(linkstack_t **ptop)
{// 1.容错判断(判空)if (IsEpLinkStack(*ptop)){perror("PopLinkStack函数出错\n");return -1;}// 2.定义pdel指向被删除节点linkstack_t *pdel = *ptop;// 3.定义一个变量temp保存出栈数据datatype temp = pdel->data; // datatype temp = (*ptop)->data;// 4.移动指针*ptop = pdel->next; // *ptop = (*ptop)->next;// 5.释放被删除节点free(pdel);pdel = NULL;return temp;
}// 5.清空栈
void ClearLinkStack(linkstack_t **ptop) // 用二级指针,是因为清空后需要将main函数中的top变为NULL
{while (!(IsEpLinkStack(*ptop))){PopLinkStack(ptop);}
}// 6.求栈的长度
int LengthLinkStack(linkstack_t *top) // 用一级指针,是因为只是求长度,不需要修改main函数中top指针的指向
{int len = 0;while (top != NULL){top = top->next;len++;}return len;
}// 7.获取栈顶数据,不是出栈,不需要移动main函数中的top,所以用一级指针
datatype GetTopLinkStack(linkstack_t *top)
{if (IsEpLinkStack(top)){perror("GetTopLinkStack函数出错\n");return -1;}return top->data;
}
主函数main.c:
#include "linkstack.h"int main(int argc, char const *argv[])
{linkstack_t *p = NULL;for (int i = 1; i <= 5; i++){PushLinkStack(&p, i);}printf("栈的长度为:%d\n", LengthLinkStack(p));while (!(IsEpLinkStack(p))){printf("%d ", PopLinkStack(&p));}printf("\n");ClearLinkStack(&p);return 0;
}
总结
顺序栈和链式栈的区别
(1)存储结构不同,顺序栈相当于数组,连续的,链式栈 链表非连续的
(2)顺序栈的长度受限制,而链栈不会
队列
顺序队列(循环队列) 和 链式队列
队列的定义
只允许在两端进行插入和删除操作的线性表,在队尾插入,在队头删除 插入的一端,被称为"队尾",删除的一端被称为"队头"。
在队列操作过程中,为了提高效率,以调整指针代替队列元素的移动,并将数组作为循环队列的操作空间。
队列的特点
先进先出 FIFO first in first out
后进后出 LILO last
顺序队列(又称为循环队列)
1.逻辑结构: 线性结构
2.存储结构:顺序存储结构
3.操作:入列,出列
结构体
#define N 5
typedef int datatype;
typedef struct
{
datatype data[N];
int rear; //存数据端 rear 后面
int front; //取数据端 front 前面
}sequeue_t;//sequence 顺序 queue队列
注意:
循环队列中,假设数组的元素个数为N,那么循环队列中存储最多的数据个数为N-1个
原因:舍去数组上的一个存储位置,用于判断队列是否为满
顺序队列的相关操作案例
头文件sequeue.h:
#ifndef _SEQUEUE_H_
#define _SEQUEUE_H_
#include <stdio.h>
#include <stdlib.h>
#define N 5
typedef int datatype;
typedef struct
{datatype data[N]; // 循环队列的数组int rear; // 存数据端 rear 后面int front; // 取数据端 front 前面
} sequeue_t;
// 1.创建一个空的队列
sequeue_t *CreateEmptySequeue();
// 2.入列 data代表入列的数据
int InSequeue(sequeue_t *p, datatype data);
// 3.判断队列是否为满
int IsFullSequeue(sequeue_t *p);
// 4.判断队列是否为空
int IsEmptySequeue(sequeue_t *p);
// 5.出列
datatype OutSequeue(sequeue_t *p);
// 6.求队列的长度
int LengthSequeue(sequeue_t *p);
// 7.清空队列函数
void ClearSequeue(sequeue_t *p);
#endif
顺序队列函数sequeue.c:
#include "sequeue.h"
// 1.创建一个空的队列
sequeue_t *CreateEmptySequeue()
{// 1.开辟一个结构体大小的空间sequeue_t *p = (sequeue_t *)malloc(sizeof(sequeue_t));if (p == NULL){perror("CreateEmptySequeue函数报错\n");return NULL;}// 2.初始化p->rear = p->front = 0;return p;
}// 2.入列 data代表入列的数据
int InSequeue(sequeue_t *p, datatype data)
{// 1.判满if (IsFullSequeue(p)){perror("InSequeue函数出错\n");return -1;}// 2.将数据入列p->data[p->rear] = data;p->rear = (p->rear + 1) % N;return 0;
}// 3.判断队列是否为满
int IsFullSequeue(sequeue_t *p)
{return (p->rear + 1) % N == p->front;
}// 4.判断队列是否为空
int IsEmptySequeue(sequeue_t *p)
{return p->rear == p->front;
}// 5.出列
datatype OutSequeue(sequeue_t *p)
{// 1.判空if (IsEmptySequeue(p)){perror("OutSequeue函数出错\n");return -1;}// 2.出列// 取出数据datatype temp = p->data[p->front];// 移动头指针p->front = (p->front + 1) % N;return temp;
}
// 6.求队列的长度
int LengthSequeue(sequeue_t *p)
{// // 1.方法一// if (p->rear >= p->front)// {// return p->rear - p->front;// }// else// {// return p->rear - p->front + N;// }// 2.方法二return (p->rear - p->front + N) % N;
}
// 7.清空队列函数
void ClearSequeue(sequeue_t *p)
{p->front = p->rear;
}
主函数main.c:
#include "sequeue.h"int main(int argc, char const *argv[])
{sequeue_t *p = CreateEmptySequeue();for (int i = 0; i < 4; i++){InSequeue(p, i);}printf("顺序队列的长度为:%d\n", LengthSequeue(p));OutSequeue(p);OutSequeue(p);OutSequeue(p);InSequeue(p, 10);printf("顺序队列的长度为:%d\n", LengthSequeue(p));while (!IsEmptySequeue(p)){printf("%d ", OutSequeue(p));}printf("\n");printf("清空顺序队列\n");ClearSequeue(p);free(p);p = NULL;return 0;
}
链式队列
1.逻辑结构: 线性结构
2.存储结构:链式存储
3.操作:入列 、出列
结构体
typedef struct node
{
datatype data;//数据域
struct node *next;//指针域
}linkqueue_node_t,*linkqueue_list_t;
typedef struct//将队列头指针和尾指针封装到一个结构体里
{
linkqueue_list_t front;//相当于队列的头指针
linkqueue_list_t rear;//相当于队列的尾指针
//有了链表的头指针和尾指针,那么我们就可以操作这个链表
}linkqueue_t;
链式队列的相关操作案例
头文件linkqueue.h:
#ifndef _LINKQUEUE_H_
#define _LINKQUEUQ_H_#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node
{datatype data; // 数据域struct node *next; // 指针域
} linkqueue_node_t, *linkqueue_list_t;// linkqueue_list_t p === linkqueue_node_t *
typedef struct // 将队列头指针和尾指针封装到一个结构体里
{linkqueue_list_t front; // 相当于队列的头指针linkqueue_list_t rear; // 相当于队列的尾指针// 有了链表的头指针和尾指针,那么我们就可以操作这个链表
} linkqueue_t;
// 1.创建一个空的队列
linkqueue_t *CreateEmptyLinkQueue();
// 2.入列 data代表入列的数据
int InLinkQueue(linkqueue_t *p, datatype data);
// 3.出列
datatype OutLinkQueue(linkqueue_t *p);
// 4.判断队列是否为空
int IsEmptyLinkQueue(linkqueue_t *p);
// 5.求队列长度的函数
int LengthLinkQueue(linkqueue_t *p);
// 6.清空队列
void ClearLinkQueue(linkqueue_t *p);
#endif
链式队列函数linkqueue.c:
#include "linkqueue.h"
// 1.创建一个空的队列
linkqueue_t *CreateEmptyLinkQueue()
{// 1.创建存放头尾指针的空间linkqueue_t *p = (linkqueue_t *)malloc(sizeof(linkqueue_t));if (p == NULL){perror("CreateEmptyLinkQueue函数创建存放头尾指针的空间出错\n");return NULL;}// 2.初始化p->front = p->rear = (linkqueue_list_t)malloc(sizeof(linkqueue_node_t));if (p->front == NULL){perror("CreateEmptyLinkQueue函数创建链表结构体的空间出错\n");return NULL;}p->front->next = NULL;return p;
}// 2.入列 data代表入列的数据
int InLinkQueue(linkqueue_t *p, datatype data)
{// 1.开辟一个节点并初始化存放数据linkqueue_list_t pnew = (linkqueue_list_t)malloc(sizeof(linkqueue_node_t));if (pnew == NULL){perror("InLinkQueue函数出错\n");return -1;}pnew->next = NULL;pnew->data = data;// 2.数据入队p->rear->next = pnew;// 3.移动尾指针p->rear = pnew;return 0;
}// 3.出列
datatype OutLinkQueue(linkqueue_t *p)
{// 1.判空if (IsEmptyLinkQueue(p)){perror("OutLinkQueue函数出错\n");return -1;}// 2.出列数据// (1)定义pdel指向头节点linkqueue_list_t pdel = p->front;// (2)移动头指针p->front = p->front->next;// (3)释放头节点free(pdel);pdel = NULL;// (4)出队数据return p->front->data;
}// 4.判断队列是否为空
int IsEmptyLinkQueue(linkqueue_t *p)
{return p->rear == p->front;
}// 5.求队列长度的函数
int LengthLinkQueue(linkqueue_t *p)
{int len = 0;linkqueue_list_t q = p->front;while (q->next!= NULL){q = q->next;len++;}return len;
}// 6.清空队列
void ClearLinkQueue(linkqueue_t *p)
{while (!IsEmptyLinkQueue(p)){OutLinkQueue(p);}
}
主函数main.c:
#include "linkqueue.h"int main(int argc, char const *argv[])
{linkqueue_t *p = CreateEmptyLinkQueue();InLinkQueue(p, 1);InLinkQueue(p, 2);InLinkQueue(p, 3);printf("链式队列的长度为:%d\n", LengthLinkQueue(p));printf("%d ", OutLinkQueue(p));printf("%d ", OutLinkQueue(p));printf("%d ", OutLinkQueue(p));printf("\n");printf("清空链式队列\n");ClearLinkQueue(p);free(p->front);p->front = NULL;free(p);p = NULL;return 0;
}
相关文章:
数据结构(学习)2024.8.8(栈,队列)
今天学习的是线性表里面的栈和队列 链表的相关知识可以查看http://t.csdnimg.cn/NX464 顺序表的相关知识可以查看http://t.csdnimg.cn/5IMAZ 目录 栈 栈的定义 栈的特点 顺序栈 结构体 顺序栈的相关操作案例 链式栈 结构体 链式栈的相关操作案例 总结 队列 队列…...
服务端开发常用知识(持续更新中)
Java方面 1 基础篇 1.1 网络基础 tcp三次握手和四次挥手-CSDN博客 tcp和udp区别,tcp拥塞控制算法和粘包问题-CSDN博客 http的发展历史,各版本的差异点,以及和https的区别-CSDN博客 2 jvm篇 3 多线程篇 4 mysql篇 5 redis篇 6 kafk…...
MySQL入门学习-运维与架构.复制过滤器
MySQL 复制过滤器是一种用于过滤复制数据的机制。它可以根据特定的规则,选择要复制的数据库、表或列,从而减少复制的数据量,提高复制性能。 一、以下是一些常见的 MySQL 复制过滤器: 1. 基于二进制日志的过滤器: 通过…...
【深度学习】生成领域里,Normalizing Flow、GAN、VAE、Diffusion Models的区别是什么?
文章目录 1. Normalizing Flow2. GAN (Generative Adversarial Networks)3. VAE (Variational Autoencoders)4. Diffusion Models总结1. Normalizing Flow公式代码示例2. GAN (Generative Adversarial Networks)公式代码示例3. VAE (Variational Autoencoders)公式代码示例4. D…...
Qt 串口通信(C++)
1. 基本概念 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接…...
聊聊AUTOSAR: 基于DaVinci的SecOC开发与配置
一、什么是SecOC 当前车载网络通讯环境越来越复杂,未采取任何安全保护的报文,一旦被伪造或者篡改,将非常危险。为了提升信息的安全性,AUTOSAR标准中引进了SecOC,加入了通讯认证机制,能够有效的辨别出信息是…...
.net6.0 重启控制台 命令
在.NET 6.0中,如果你想要创建一个命令行应用程序来重启当前运行的控制台,你可以使用System.Diagnostics命名空间下的Process类来启动一个新的进程,并结束当前进程。 以下是一个简单的示例代码,展示了如何实现重启控制台的功能&am…...
LVS 调度器 nat和DR模式
lvs-nat 修改请求报文的目标IP,多目标IP的DNAT 配置网络 LVS主机 注意网卡的顺序 (nat和主机模式) [rootlvs ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection [connection] idens160 typeethernet interface-nameens160 [ip…...
MTK Android12 SystemUI 手势导航 隐藏导航栏底部布局
问题:android12 平台手势导航情况下,app页面未设置全屏情况下,底部导航栏会有一个高度的颜色,底部导航会有一个手势导航提示条 需求:去掉手势导航情况下底部的导航栏和手势提示条 文章目录 相关资源修改问题描述解决方案代码跟踪中间提醒小方块代码查找底部手势导航条跟踪…...
electron调用c++ dll lib
主要的工具包 node-addon-apinode-gyp 主要的配置 {"variables": {# module_mac: "./../sdk/mac",},"targets": [{"target_name": "native_module","defines": ["NAPI_DISABLE_CPP_EXCEPTIONS"],&qu…...
23种设计模式(持续更新中)
参考链接干货分享 | 《设计模式之美》学习笔记 - 知乎 (zhihu.com) 总体来说设计模式分为三大类: 创建型模式,共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共7种:适配器模式、…...
Linux文件系统详解
Linux的一切皆文件 Linux 中的各种事物比如像文档、目录(Mac OS X 和 Windows 系统下称之为文件夹)、键盘、监视器、硬盘、可移动媒体设备、打印机、调制解调器、虚拟终端,还有进程间通信(IPC)和网络通信等输入/输出资…...
大数据面试SQL(五):查询最近一笔有效订单
文章目录 查询最近一笔有效订单 一、题目 二、分析 三、SQL实战 四、样例数据参考 查询最近一笔有效订单 一、题目 现有订单表t5_order,包含订单ID,订单时间,下单用户,当前订单是否有效。 请查询出每笔订单的上一笔有效订…...
OpenCV图像滤波(8)getGaborKernel()函数的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数返回 Gabor 滤波器系数。 Gabor 滤波器在图像处理中非常有用,特别是在纹理分析、特征提取和边缘检测等领域。 函数原型 Mat c…...
门店收银系统源码+同城即时零售多商户入驻商城源码
一、我们为什么要开发这个系统? 1. 商户经营现状 “腰尾部”商户,无小程序运营能力;自营私域商城流量渠道单一;无法和线下收银台打通,库存不同步,商品不同步,订单不同步; 2.平台服…...
MaxKB:基于 LLM大语言模型的知识库问答系统实操
1.MaxKB介绍 MaxKB 是一款基于 LLM(Large Language Model)大语言模型的知识库问答系统。MaxKB 的产品命名内涵为 “Max Knowledge Base”,为用户提供强大的学习能力和问答响应速度,致力于成为企业的最强大脑。与同类基于 LLM 的知…...
linux文件命令:更新文件时间戳的工具touch详解
目录 一、概述 二. touch 命令的基本用途 三. touch 命令的语法 3.1、语法 3.2、touch 命令的选项 3.3、时间字符串格式 四. 常用场景 4.1 创建空文件 4.2 同时创建多个文件 4.3 更新文件的时间戳 4.4 只更新访问时间 4.5 只更新修改时间 4.6 设置特定时间戳 4.7 使用另…...
Docker学习(6):Docker Compose部署案例
一、docker-compose部署mysql 1、准备镜像 2、编写my.cnf配置文件 # 服务端参数配置 [mysqld] usermysql # MySQL启动用户 default-storage-engineINNODB # 创建新表时将使用的默认存储引擎 character-set-serverutf8mb4 # 设置mysql服务端默认字符集…...
4章3节:处理医学类原始数据的重要技巧,R语言中的宽长数据转换,tidyr包的使用指南
在数据分析中,数据的存储方式直接影响分析过程的效率和准确性。常见的数据存储形式有宽型数据(wide format)和长型数据(long format)。宽型数据适合人类查看和理解,而长型数据则更适合计算机处理和分析。为此,R语言提供了tidyr包,用于在这两种数据格式之间进行转换。本…...
[Web安全架构] HTTP协议
文章目录 前言1. HTTP1 . 1 协议特点1 . 2 URL1 . 3 Request请求报文1 . 3 .1 请求行1 . 3 .2 请求头1 . 3 .3 请求正文1 . 3 .4 常见传参方式 1 . 4 Response响应报文1 . 4 .1 响应行1 . 4 .2 响应头1 . 4 .3 响应正文 2. Web会话2 .1 Cookie2 .2 Session2 .3 固定会话攻击 前…...
猫抓扩展深度优化:让资源嗅探效率提升300%的实战指南
猫抓扩展深度优化:让资源嗅探效率提升300%的实战指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字内容爆炸的时代,…...
3步实现全适配界面:Vant Weapp组件库无障碍设计指南
3步实现全适配界面:Vant Weapp组件库无障碍设计指南 【免费下载链接】vant-weapp 轻量、可靠的小程序 UI 组件库 项目地址: https://gitcode.com/gh_mirrors/va/vant-weapp 无障碍设计是现代应用开发的核心要求,它不仅能让应用覆盖更广泛的用户群…...
金融交易核心-FIX协议关键字段解析与应用实战
1. FIX协议基础与金融交易核心地位 FIX(Financial Information eXchange)协议就像金融交易领域的"普通话",它让全球不同交易所、券商和投资机构能够用同一种电子语言沟通。想象一下,如果没有统一协议,纽约的…...
如何用快马AI平台十分钟快速构建你的第一个Android应用原型
最近在尝试用AI工具快速构建Android应用原型,发现InsCode(快马)平台特别适合做这种快速验证。今天就用它来演示如何十分钟搭建一个天气应用原型,整个过程比传统开发方式高效太多了。 明确原型需求 首先梳理出这个天气应用需要三个核心模块:首…...
新手入门:在快马平台用基础代码实现个人EndNote
最近在整理学术资料时,发现需要频繁记录和分类文献信息。作为编程新手,想尝试自己做个简单的网页工具来管理这些内容。通过InsCode(快马)平台的智能生成功能,居然用基础代码就实现了一个迷你EndNote,整个过程特别适合像我这样的初…...
SEO_资深专家分享SEO内容优化的核心方法
SEO内容优化的核心方法:资深专家分享 在当今竞争激烈的互联网时代,搜索引擎优化(SEO)已经成为提升网站流量和品牌知名度的关键。资深专家在SEO领域积累了丰富的经验,他们提出了许多实用的方法来优化内容。本文将详细探…...
自动驾驶规划新范式:像人一样用‘矢量关系’思考,VAD三大安全约束详解
自动驾驶规划新范式:像人一样用‘矢量关系’思考,VAD三大安全约束详解 想象一下,在高峰时段的城市十字路口,人类驾驶员能瞬间判断左侧公交车的变道意图,同时预判右前方自行车可能出现的摇摆——这种基于空间关系的直觉…...
如何用三月七小助手实现星穹铁道全自动化游戏体验
如何用三月七小助手实现星穹铁道全自动化游戏体验 【免费下载链接】March7thAssistant 崩坏:星穹铁道全自动 三月七小助手 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 在《崩坏:星穹铁道》的广阔宇宙中,每位开拓…...
Altium Designer 22 实战:用这个隐藏技巧,为DIP插件焊盘穿上‘防烫服’
Altium Designer 22实战:用丝印层为DIP焊盘打造双重防护 手工焊接DIP插件时,烙铁温度过高或操作不当导致绿油层损坏,进而引发短路问题,是硬件工程师经常遇到的痛点。特别是在生产线上,工人为了效率往往将烙铁温度调至最…...
STM32H755双核MCU的以太网配置:避开Cache缓存和MPU的那些坑(CubeIDE实战)
STM32H755双核MCU以太网配置实战:Cache与MPU的深度优化指南 在嵌入式系统开发中,以太网通信已成为工业控制、物联网网关等场景的标配功能。而STM32H7系列凭借其双核架构和丰富的外设资源,成为高性能嵌入式应用的理想选择。然而,当…...
