数据结构(二):队列和栈

一、队列在线程池中的工作原理及执行顺序

 public ThreadPoolExecutor(int corePoolSize, // 维护线程的最小数量
                              int maximumPoolSize,		// 最大线程数
                              long keepAliveTime,		// 允许空闲时间
                              TimeUnit unit,		// 事件单位
                              BlockingQueue<Runnable> workQueue, // 阻塞队列
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {	// 拒绝策略
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }

假如队列大小为10,corePoolSize为3,maximumPoolSize为6,当加入20个任务时的执行顺序如下:
——执行corePoolSize的对应大小,即任务1、2、3
——当corePoolSize满了则创建队列,故任务4-13加入队列
——队列已满后,任务14、15、16马上执行,达到maximumPoolSize的值不能再添加任务
——故任务17-20将被抛出异常
——所以最终的执行顺序是:1、2、3、14、15、16、4、5、6、7、8、9、10、11、12、13。

二、队列的分类

队列的特征是先进先出,运算受限的线性表,有队头和队尾

1、一般队列
在这里插入图片描述
以上是一般队列的示例图,队头指向第一个元素,队尾指向最后一个元素后的空位置
当队列为空时,front == rear
当出现最后一个图的现象时叫假溢出,队尾后面已满,但队头前面还有空位置,为避免此现象故引入了循环队列~

2、循环队列:头尾相连的存储结构(代码如何实现?)
在这里插入图片描述
假设循环队列总容量为N,并且预留一个空的位置作为队列空,满,长度判断标志:
队列空:front == rear;
队列满:(rear+1)%N==front;(此处要求模是因为0和最后一个值交接为头尾时的处理)
队列元素个数:(rear – front + N)%N

3、链式队列:就是线性表的单链表,但只能尾进头出,其增加和删除操作简单
在这里插入图片描述

三、队列变形

1、双端队列
Deque是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行,如ArrayDeque和LinkedList

2、优先级队列
优先级队列和通常的栈和队列一样,处理时首先处理优先级最高的。如果两个元素具有相同的优先级,则按照他们插入到队列中的先后顺序处理,如MessageQueue和PriorityQueue

四、leetcode 算法题

621题 任务调度器
641题 设计循环双端队列
933题 最近的请求次数

五、栈:后进先出,运算受限的线性表

1、栈的特性:仅允许在表的一端进行插入和删除运算
在这里插入图片描述
2、 栈的存储结构有两种
——顺序结构:通过数组实现
在这里插入图片描述

——链式结构:使用链表存储结构
进栈示例:

s.next = stack.top;
stack.top = s;
stack.count ++;

在这里插入图片描述
出栈示例:

p = stack.top;
stack.top = p.next;
p.next = null;
stack.count --;

在这里插入图片描述

六、面试题:Stack通过Vector实现为不良设计,为什么

在这里插入图片描述
如图是Stack的源码继承关系,Stack源码中本身有以下方法:
在这里插入图片描述
但继承的Vector.java中也继承了父类AbstractList中的add()方法,此方法可在随意位置添加对象,不符合栈‘仅允许在表的一端进行插入和删除运算’的特性~~~
在这里插入图片描述

七、栈的经典应用——逆波兰表达式(用队列和栈实现)

八、栈溢出

StackOverflowError:栈溢出,运算逻辑
——发生情况:比如递归调用,当方法一直压入栈,栈满后将会发生栈溢出

OutOfMemoryError: 堆溢出,存储逻辑

九、栈相关的leetcode算法题

有效的括号
逆波兰表达式求值
用队列实现栈
字符串解码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值