《五月集训》第十六日——队列

本文是五月集训的第十六天,重点讨论了队列在编程中的应用,通过分析力扣的四道题目(933,2073,641,1670),详细讲解了如何利用队列解决实际问题,包括最近请求计数、购票时间计算、设计循环双端队列和前中后位置操作的队列。
摘要由CSDN通过智能技术生成

前言

这是五月集训的第十六日,今日的训练内容是 队列

队列的笔记

今日学习的内容是队列,队列其实就是一种操作受限的线性表,只允许在一头写入数据在另一头删除数据,在《数据结构》中也学习过相关的内容,但实际上去上机写代码还没有过,因此今日将记录一下链式存储结构的队列的构建、插入结点、删除结点等操作的代码,并把个人的理解等记录在注释中,也方便日后的复习(也方便写题的时候当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

原题链接

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值