前言
这是五月集训的第十六日,今日的训练内容是 队列
队列的笔记
今日学习的内容是队列,队列其实就是一种操作受限的线性表,只允许在一头写入数据在另一头删除数据,在《数据结构》中也学习过相关的内容,但实际上去上机写代码还没有过,因此今日将记录一下链式存储结构的队列的构建、插入结点、删除结点等操作的代码,并把个人的理解等记录在注释中,也方便日后的复习(也方便写题的时候当c++的对象用(x))
typedef struct{
//定义结点
int data;
struct Node* next;
}Node;
typedef struct{
//定义队列
Node *head,*tail;
int size; //队列长度
}que;
void que_enter(que *a,int dt){
//用尾插法插入队列
Node *b = (Node*)malloc(sizeof(Node)); //申请内存
b->data = dt;
b->next = NULL;
if(a->tail){
//如果尾结点不为空
a->tail->next = b; //尾结点的next指针指向新插入的结点
a->tail = b; //尾结点变为插入的结点
}else{
//如果尾结点为空
a->head = a->tail = b; //头结点和尾结点都是这个
}
a->size++; //插入完结点后队列长度增加
}
void que_out(que *a){
//将头结点移出队列
Node *tmp = a->head; //定义一个中继结点,复制头结点,防止链表断开
a->head = tmp->next; //使头结点变为tmp所指的下一个结点,原结点解链
free(tmp); //释放tmp结点
a->size--; //队列长度减一
if(a->size==0) a->tail = NULL; //长度为0时使尾结点也一起指向空
}
void que_destroy(que *a){
//清空队列
while(a->size!=0){
//队列长度不为0时就出队
que_out(a);
}
}
解题报告
1.力扣933
原题链接
题目概述
写一个 RecentCounter 类来计算特定时间范围内最近的请求。
请你实现 RecentCounter 类:
RecentCounter() 初始化计数器,请求数为 0 。
int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。
保证 每次对 ping 的调用都使用比之前更大的 t 值。
解题思路
这题比较简单,简单的构建一个队列,然后往内部填充元素的时候一边填入就一边移动尾指针,并且使得计数器增加,然后实时判断 t 减去头指针指向的元素的大小是不是大于3000,如果大于3000的话就移动头指针,并且使得计数器减一,直到小于3000的时候就跳出循环,返回计数器。
源码剖析
typedef struct {
int front; //头指针
int rear; //尾指针
int *que;
int cal;
} RecentCounter;
RecentCounter* recentCounterCreate() {
RecentCounter* obj =(RecentCounter*)malloc(sizeof(RecentCounter));
obj->front=0;
obj->rear=0