今天一起说说数据结构:队列。
(一)队列
①介绍
队列是一种特殊的线性表,只能在头尾两端进行操作。队尾(rear):只能从队尾添加元素,一般焦作enQueue,入队
队头(front):只能从队头移除元素,一般焦作deQueue,出队
先进先出的原则、FirstInFistOut,FIFO(跟栈是反的,栈是后进先出)
左边是添加的,后边是提取出来的。
②生活中的队列
排队买票,排队吃饭等等③队列的接口设计
intsize();//添加元素
booleanisEmpty();//是否为空
voidenQueue(Eelement);//入队
EdeQueue();//出队
Efront();//获取队列的头元素
voidclear();//清空
想想场景,在排队的时候,都会发一个牌子,或者自发的搞的顺序的编号,是不是可以使用动态数组,链表。优先使用双向链表,因为队列主要是往头尾操作元素。
④代码演示
使用之前专题中说过的,链表的LinkedList来完成队列enQueue入队,直接按照链表往后添加就可以了。
deQueue出队,就是从头开始出一个一个出,直接remove(0)front就是队头,直接取第一个元素就可以了。测试输出结果。
(二)刷题
①用栈实现队列
准备2个栈,inStack,outStack入队时,push到inStack出队时,如果outStack为空格,将inStack所有元素逐一弹出,push到outStack,outStack弹出栈顶元素。如果outStack不会空,outStack弹出栈顶元素。②假设如下操作:11入队,22入队,出队,33入队,出队。
11入队,22入队,直接放入inStack就可以了。
出队,将inStack里面的22,11放入outStack中,然后在将11弹出。出队肯定是1个元素出队
33入队,直接放入inStack就可以了。
执行出队,因为已经在outStack中了,直接让22出队就可以了
③刷题
直接使用java官方的Stack。这个题目的方法名称跟栈的名称是一样的。用栈的功能来实现队列的功能,不光是出队,还是获取队头元素,都需要先判断outStack是否为空,如果为空,如果为空都需要往outStack里面放,如果不为空,就直接按照队列的放入就可以了。判断是否为空的时候,一定要inStack和outStack都为空才为空。
(三)分析java官方的队列源码
①官方的Queue在java.util中
②源码
是个接口看不到实现,仔细看谁实现了其实是LinkedListoffer就是入队poll就是出队peek获取队头元素
LinkedList实现了DequeDeque实现了Queue
PS:java底层的Queue,就是通过LikedList来实现的。队列容易理解,反应到现实中,很好理解。