LeetCode笔记---Java语言->线程池与任务队列(队列)

LeetCode笔记—Java语言->线程池与任务队列

队列的简述:

队列:是一片连续的存储区域(有一个头指针,一个尾指针->最后一个元素的下一位)FIFO-先入先出。

队列-假溢出:队列中还有空的位置,只是因为尾节点走到了最后一位。

循环队列:(走到尾部在从头开始):为了解决队列假溢出。

队列的典型应用场景(通常用在缓冲区用途):

1.CPU的超线程技术
2.线程池的任务队列(函数式编程思想-范型编程思想):

leetcode:622. 设计循环队列

此题思路:略

class MyCircularQueue {
   
        int[] queue;
        int head;
        int tail;
        int count;
    //构造器,设置队列长度为 k 。    
    public MyCircularQueue(int k) {
   
        queue = new int [k];//采用数组来做队列
        head = 0;//头指针
        tail = 0;//尾指针--指向下一个插入元素的位置
        count = 0;//队列中的元素数
    }
    //向循环队列插入一个元素。如果成功插入则返回真。
    public boolean enQueue(int value) {
   
        if(isFull())//队列满了就不能插入了
            return false;
        queue[tail] = value;//将元素插入到tail所在的位置上。

        /*(tail+1)%queue.length就启到了循环的作用,因为tail在插入一个元素后,就需要往后走一位
        当tail处于length-1的位置时,再往后走就需要走到队列的起始点,这时我们就需要对queue的length
        取余,(length-1+1)%length=0,tail就回到了起始点*/
        tail = (tail+1)%queue.length;
        count++;//元素数量加一
        return true;
    }
    //从循环队列中删除一个元素。如果成功删除则返回真
    public boolean deQueue() {
   
        if(isEmpty())//队列为空就不能出队了
            return false;
        head = (head+1)%queue.length;//出队,首节点向后移动一位,同时(head+1)%queue.length也是起到了循环队列的作用
        count--;//元素数量减一
        return true;
    }
    //从队首获取元素。如果队列为空,返回 -1 
    public int Front() {
   
        if(isEmpty())//列表为空,返回-1
            return -1;
        return queue[head];//返回队首元素
    }
    //获取队尾元素。如果队列为空,返回 -1 
    public int Rear() {
   
        if(isEmpty())//列表为空,返回-1
            return -1;
        /*因为tail的位置是在下一个要插入的位置上,所以队尾元素在他的前一个位置上,
        当正常情况下,只需要tail-1即可。但是当tail在0位置上的时候,就需要一些特
        殊处理。所以我们采用(tail-1+queue.length)%queue.length获取tail的前一
        个位置,当tail处在正常情况时,不会对结果产生影响。而当tail处在0位置时,
        0-1=-1,-1+queue.length=queue.length-1。这样就得到了队列的最后一个位置*/    
        return queue[(tail-1+queue.length)%queue.length];
    }
    //检查循环队列是否为空。
    public boolean isEmpty() {
   
        return count == 0;//队列中无元素,队列就是空的
    }
    //检查循环队列是否已满。
    public boolean isFull() {
   
        return count == queue.length;//当队列中元素和队列长度相同,那么队列就满了
    }
}

/**
 * Your MyCircularQueue object will be instantiated and called as such:
 * MyCircularQueue obj = new MyCircularQueue(k);
 * boolean param_1 = obj.enQueue(value);
 * boolean param_2 = obj.deQueue();
 * int param_3 = obj.Front();
 * int param_4 = obj.Rear();
 * boolean param_5 = obj.isEmpty();
 * boolean param_6 = obj.isFull();
 */

leetcode:641. 设计循环双端队列

此题思路:略

class MyCircularDeque {
   
    int[] queue;
    int head;
    int tail
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值