瞬解 队列 -- 循环队列问题(超超超详解)

什么是循环队列: 

在我们写那到题之前 我们得先了解循环队列是什么样的结构:>

 就是这样 空间填满了之后回到开始得位置 可以之前的数据删掉 来存储新的数据  这样我们就可以使用这种结构 用一定的存储空间 来存储更多的数据 那了解完 来看看我们的题吧

:力扣

这里其实用 数组 和 链表 的区别不大其实

但是都是要用到两个变量来记录这个队列的对头和队尾的也就是 front 和 back 

那既然这样 我们在 增加,删除数据的时候front 和 back 怎么变化内

其实很简单 在我们增加数据的时候back++就可以了 删除数据的时候 front++就可以了

而当back已经填完了数组要回到下标为0的位置  而链表只要把把front置为front->next 所以要用链表的话 设置成循环链表会更好  实际上也差不了多少 这里我们就用数组来解决了

我们之前不是设置了front 和 back 嘛  而且我们填满了之后不是要删一些数据才能继续嘛 所以什么时候为满 什么时候为空内? 这是个问题大家可以思考一下下

大家看就遇到这种情况了 那该怎么解决这个问题内? 

 我们更正好思路后 在来看这道题:>

 

 因为我们设定的这个循环队列里面是有几个变量 就把他们全部包在一起 

typedef struct {
    int* a;
    int front;
    int back;
    int k;
} MyCircularQueue;

  因为这个循环队列 里面放的整型数据所以是int*类型  加之我们这里使用数组的方法来实现的,大家也可以下可以下来是一下链表的方式来实现

这里的 k 也就是我们这个空间能够放的数据的最大数量  放在里面是因为 题目给我们的 k 只在后面的  MyCircularQueue* myCircularQueueCreate(int k) 里面给出 加上我们后面有判断临界时会用到 所以也要包在里面

 因为如果我们只是单一的创建一个变量 再对变量里面的成员赋值 最后返回我们创建的变量的地址 大家想想这样可以嘛?

首先 我们想想一个函数在返回后 这里面给变量分配的空间会怎么样?

怎么样是不是已经有答案了呢

也就是说  在我们决定一个函数的返回值的时候 尽量不要返回函数中临时变量的地址 我本人是不建议在编写一个函数的时候这样做的  因为你返回后你这个函数的临时变量的空间就被还回去了 而这个指向这片空间的地址(指针)还指向这里的 所以如果你在使用这种指针 也就是 用了 野指针 了 这样肯定是不行的  所以平常我们在对于指针的控制 要变得敏感一点

像不用的指针 就把它置为空  就好像 一条狗 你不希望它去做任何事情只想让它留在原地 就拿绳子栓着 或者 让别人看着  这里的限制条件就是 NULL  

MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    assert(obj);
    obj->a = (int*)malloc((k + 1) * (sizeof(int)));
    obj->front = obj->back = 0;
    obj->k = k;
    return obj;
}

 


这里面的printf不属于 这个函数的实现 这个在我在调试的时候使用的一个小方法 因为对于这种多接口型的这种题 又时我们不知到 是哪里突然结束 的时候就可以这样

这个函数是用来填数据 我们肯定是先填数据再把tail往后面移动  所以先把数据填进去 在来看back该怎么移动是不是到达临界  如果是链表可以省去判断这一步骤

在填入数据之前还得看一下这个空间是不是有余的所以要判断一下 空间是否满 如果是满的就直接返回 false 

这个删除数据的函数和填入数据 相差不大 删除数据就只需要 把front往前移就可以了 之前的数据你可以把 它置为其他数据 也可以不用管它 

  

这个是返回头和尾的函数 对于返回头 就只需要返回front所在的位置就可以了 因为front一直都是头

返回尾的函数 就像上面 说的back是在最后一个数据的下一个位置 所以在返回尾的时候 只需要返回back-1位就可以了 但back是有可能为0的 所以要进行判断 不然会造成数组越界 当back为0时 那它的前一个在哪里呢? 是不是在整个空间的 末尾 所以这个返回k位就可以了

(k为3 我们开辟4个空间 最后一个空间下标正好为3)

这个是判空 判满函数 判空很容易就只需要 判断front==back 就行了

判满函数 当你填入数据为满时有两种情况  

就是这样如果不是在空间的头尾 那么就来看back+1==front就行了

注意 在使用 判空 判满函数时要注意 他们放的位置因为 程序在使用一个函数是向上查找 如果放在下面 它会报错 

最后的这个free函数就没什么好说的了 就把我们之前开辟的空间free掉就可以了  


这样我们循环队列就说完了 谢谢大家能够看到这里 祝大家以后都能拿到自己心仪大厂的offer!! 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值