• LeetCode第622题—设计循环队列


    本次写的题目是设计循环队列,为LeetCode里面的题目,让我们来康康是如何解出这道题目的吧,各位尚没有思路的小伙伴可以跟随着博主的解题思路一步步来,感受一下😎

    🌱分析阶段

    首先来看看题目吧~

    在本道题目中,看到了两组关键字,首先是“循环”,然后是“队列”。在学习完了顺序表,链表,栈等知识后,发现没有一个直接的数据结构可以让我们来实现对队列的仿写。于是决定制作一个循环数列,来仿写该队列,具体图示如下👇:

    在本文中front是队头,rear表示队尾。制作这样子的循环数组我们需要先解决下面两个问题:

    1. 当rear下标到达7的时候,如何从7位置到0位置上?
    2. 我们要如何判断数组是空还是满?

    首先解决问题1️⃣,问题一的解决只需要用到一个公式:rear = (rear+1)%数组长度;只要rear每往下走一步,我们就用这个公式来计算rear的位置,从而代替 rear = rear++  这一行代码。

    然后解决问题2️⃣,问题二的解决方法有三个:①设立一个flag,作为记录;②实际长度==数组长度;③将图中的front的前一个位置空出来,等到rear到达front前一个位置的时候就证明已经满了。在这里问题二的解决我们采用第三种方法。

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    首先来讲解一下第三种方法😎:

    第三种方法相当于在front位置的前一个位置上设立了一个警戒线(该位置不放数据),如果rear已经到达那个警戒线,我们发现rear再走下一步就到了front的位置的时候,就证明数组已经放满。

    考虑到要从7到0的移动,且要用于判定下一个是不是front位置或者rear位置,在这里我们使用  rear = (rear + 1)%  数组长度     front = (front + 1)%  数组长度  来使rear、front往下一步走。

    以上便是全部的分析阶段,在分析完上面后,我们写代码思路会变的非常清晰😎 


    🌱代码阶段

    首先我们需要一个数组,创建一个数组,先不设置大小,然后再创建两个int变量,分别命名为front和rear。我们又知道,题目中有个构造函数,我们的数组大小再构造函数内创建👇:

    1. class MyCircularQueue {
    2. public int[] elem;
    3. public int front;
    4. public int rear;
    5. public MyCircularQueue(int k) {
    6. elem = new int[k];
    7. }
    8. //暂时把其他函数给省略
    9. }

    在创建完后,我们开始写各个函数的代码是😎


    🍃enQueue函数

    创建enQueue函数过程蛮简单,就是先判定队列有没有满,如果满了就返回false;如果没满就放入数据,然后rear用之前分析阶段提出的公式往后走一步👇

    1. class MyCircularQueue {
    2. public int[] elem;
    3. public int front;
    4. public int rear;
    5. public MyCircularQueue(int k) {
    6. elem = new int[k];
    7. }
    8. public boolean enQueue(int value) {
    9. if(isFull()){
    10. return false;
    11. }
    12. elem[rear] = value; //入队
    13. rear = (rear+1)%elem.length; //rear往下走一步
    14. return true;
    15. }
    16. //其他未写函数暂时省略
    17. }

    🍃isFull函数

    这个需要用到判断rear的下一个位置是不是front位置的函数,具体代码如下👇:

    1. class MyCircularQueue {
    2. public int[] elem;
    3. public int front;
    4. public int rear;
    5. public MyCircularQueue(int k) {
    6. elem = new int[k];
    7. }
    8. public boolean enQueue(int value) {
    9. if(isFull()){
    10. return false;
    11. }
    12. elem[rear] = value; //入队
    13. rear = (rear+1)%elem.length; //rear往下走一步
    14. return true;
    15. }
    16. public boolean isFull() {
    17. if((rear+1)%elem.length==front){ //若rear的下一个位置是front,结果为满,则返回true
    18. return true;
    19. }
    20. return false;
    21. }
    22. }

    🍃isEmpty函数

    这个函数的判断很简单,当front和rear的位置相同的时候,就可以说明此时是空的数组。

    1. class MyCircularQueue {
    2. public int[] elem;
    3. public int front;
    4. public int rear;
    5. public MyCircularQueue(int k) {
    6. elem = new int[k];
    7. }
    8. public boolean enQueue(int value) {
    9. if(isFull()){
    10. return false;
    11. }
    12. elem[rear] = value; //入队
    13. rear = (rear+1)%elem.length; //rear往下走一步
    14. return true;
    15. }
    16. public boolean isEmpty() {
    17. return rear==front;
    18. }
    19. public boolean isFull() {
    20. if((rear+1)%elem.length==front){ //若rear的下一个位置是front,结果为满,则返回true
    21. return true;
    22. }
    23. return false;
    24. }
    25. }

    🍃deQueue函数

    这个函数是出队列的意思,我们的第一步是判断数组是不是为空,如果是空则直接返回false;如果不是再将front往前移动一个位置。具体代码如下👇:

    1. class MyCircularQueue {
    2. public int[] elem;
    3. public int front;
    4. public int rear;
    5. public MyCircularQueue(int k) {
    6. elem = new int[k];
    7. }
    8. public boolean enQueue(int value) {
    9. if(isFull()){
    10. return false;
    11. }
    12. elem[rear] = value; //入队
    13. rear = (rear+1)%elem.length; //rear往下走一步
    14. return true;
    15. }
    16. public boolean isEmpty() {
    17. return rear==front;
    18. }
    19. public boolean deQueue() {
    20. if(isEmpty()){
    21. return false;
    22. }
    23. front = (front+1)%elem.length;
    24. return true;
    25. }
    26. public boolean isFull() {
    27. if((rear+1)%elem.length==front){ //若rear的下一个位置是front,结果为满,则返回true
    28. return true;
    29. }
    30. return false;
    31. }
    32. }

    🍃front函数

    首先要注意,该队列中不能为空,如果判定为空了,那么我们要返回-1(题目要求)。

    然后要返回front位置的元素,这里直接返回即可。具体代码如下👇:

    1. class MyCircularQueue {
    2. public int[] elem;
    3. public int front;
    4. public int rear;
    5. public MyCircularQueue(int k) {
    6. elem = new int[k];
    7. }
    8. public boolean enQueue(int value) {
    9. if(isFull()){
    10. return false;
    11. }
    12. elem[rear] = value; //入队
    13. rear = (rear+1)%elem.length; //rear往下走一步
    14. return true;
    15. }
    16. public boolean isEmpty() {
    17. return rear==front;
    18. }
    19. public boolean deQueue() {
    20. if(isEmpty()){
    21. return false;
    22. }
    23. front = (front+1)%elem.length;
    24. return true;
    25. }
    26. public int Front() {
    27. if(isEmpty()){
    28. return -1;
    29. }
    30. return elem[front];
    31. }
    32. public boolean isFull() {
    33. if((rear+1)%elem.length==front){ //若rear的下一个位置是front,结果为满,则返回true
    34. return true;
    35. }
    36. return false;
    37. }
    38. }

    🍃rear函数

    首先要注意,该队列中不能为空,如果判定为空了,那么我们要返回-1(题目要求)。

    这里我们要注意的是,由于再前面我们写的enQueue入队函数的机制是在添加完一个元素后rear往下走,此时rear的位置处是还未放入数据的,所以我们要弹出的是rear-1处位置的元素。还要特别注意的是,当rear==0时不能减一,否则就变为-1了,所以我们要分情况讨论。这时就可以用到三目表达式。具体代码如下👇:

    1. class MyCircularQueue {
    2. public int[] elem;
    3. public int front;
    4. public int rear;
    5. public MyCircularQueue(int k) {
    6. elem = new int[k];
    7. }
    8. public boolean enQueue(int value) {
    9. if(isFull()){
    10. return false;
    11. }
    12. elem[rear] = value; //入队
    13. rear = (rear+1)%elem.length; //rear往下走一步
    14. return true;
    15. }
    16. public boolean isEmpty() {
    17. return rear==front;
    18. }
    19. public boolean deQueue() {
    20. if(isEmpty()){
    21. return false;
    22. }
    23. front = (front+1)%elem.length;
    24. return true;
    25. }
    26. public int Front() {
    27. if(isEmpty()){
    28. return -1;
    29. }
    30. return elem[front];
    31. }
    32. public int Rear() {
    33. if(isEmpty()){
    34. return -1;
    35. }
    36. //设置一个index作为记录返回的位置
    37. int index = (rear==0) ? elem.length-1 : rear-1 ;
    38. return elem[index];
    39. }
    40. public boolean isFull() {
    41. if((rear+1)%elem.length==front){ //若rear的下一个位置是front,结果为满,则返回true
    42. return true;
    43. }
    44. return false;
    45. }
    46. }

    至此,所有函数都大致完成了,但还有一处错误,让我们先运行逝逝😎

    出现了如上错误,让我们来分析一下👇

    原因是我们空了一个位置出来,所以在创建数组的时候要变成k+1,所以完整代码如下👇:

    1. class MyCircularQueue {
    2. public int[] elem;
    3. public int front;
    4. public int rear;
    5. public MyCircularQueue(int k) {
    6. elem = new int[k+1]; //注意这里要k+1大小,因为我们采用了空一格位置不放元素的方法。
    7. }
    8. public boolean enQueue(int value) {
    9. if(isFull()){
    10. return false;
    11. }
    12. elem[rear] = value; //入队
    13. rear = (rear+1)%elem.length; //rear往下走一步
    14. return true;
    15. }
    16. public boolean isEmpty() {
    17. return rear==front;
    18. }
    19. public boolean deQueue() {
    20. if(isEmpty()){
    21. return false;
    22. }
    23. front = (front+1)%elem.length;
    24. return true;
    25. }
    26. public int Front() {
    27. if(isEmpty()){
    28. return -1;
    29. }
    30. return elem[front];
    31. }
    32. public int Rear() {
    33. if(isEmpty()){
    34. return -1;
    35. }
    36. //设置一个index作为记录返回的位置
    37. int index = (rear==0) ? elem.length-1 : rear-1 ;
    38. return elem[index];
    39. }
    40. public boolean isFull() {
    41. if((rear+1)%elem.length==front){ //若rear的下一个位置是front,结果为满,则返回true
    42. return true;
    43. }
    44. return false;
    45. }
    46. }

    以上!便是全部代码了😎来运行一下逝逝吧~

     nice😎✨

  • 相关阅读:
    Linux Bash如何删除一个文件夹下(包含子文件夹)所有的jpg格式的文件,删除某一类(同一名字)文件夹下的所有类型文件
    PHP7.4 json_encode 造成float数据精度异常情况
    Knife4j使用教程(二) -- 配置Swagger相关信息
    抛弃moment.js,基于date-fns封装日期相关utils
    PAT 甲级 A1107 Social Clusters
    Android网络通讯之OkHttp
    HTML5+CSS3小实例:纯CSS实现彩虹倒映水面的唯美背景
    spark中结合源码理解reduceByKey、groupByKey、combineByKey等几个ByKey算子的区别
    java计算机毕业设计web扶贫产品物资管理平台MyBatis+系统+LW文档+源码+调试部署
    新加坡科技巨头Sea亏损小于预期,外资“清算”阿里只为加大赌注
  • 原文地址:https://blog.csdn.net/Green_756/article/details/126551299