【Java基础/数据结构】栈(Stack)与队列(Queue、Deque)

Stack

栈(Stack)是一种后进先出(LIFO:Last In First Out)的数据结构。

           ───────────────────────────────┐
  (\(\       (\(\    (\(\    (\(\    (\(\ │
 (='.') <─> (='.')  (='.')  (='.')  (='.')│
O(_")")    O(_")") O(_")") O(_")") O(_")")│
           ───────────────────────────────┘

Stack只有入栈和出栈的操作:

  • 把元素压栈:push(E)
  • 把栈顶的元素“弹出”:pop()
  • 取栈顶元素但不弹出:peek()

Java Stack类:https://www.runoob.com/java/java-stack-class.html

序号方法描述
1boolean empty() 测试堆栈是否为空。
2Object peek( ) 查看堆栈顶部的对象,但不从堆栈中移除它。
3Object pop( ) 移除堆栈顶部的对象,并作为此函数的值返回该对象。
4Object push(Object element) 把项压入堆栈顶部。
5int search(Object element) 返回对象在堆栈中的位置,以 1 为基数。

但由于Vector由于效率问题已经被弃用,因此继承Vector的Stack也存在效率问题,故不推荐使用。Deque接口及其实现提供了更完整和一致的LIFO堆栈操作集,应优先使用此类。因此,在Java中,我们用Deque可以实现Stack的功能,注意只调用push()/pop()/peek()方法,避免调用Deque的其他方法。Deque双端队列可以实现多种数据结构,完全可以模拟成栈的结构。

Queue

队列(Queue)是一种先进先出(FIFO)的数据结构,简称队,也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队或进队;删除元素称为出队或离队。

          ────────────────────────
  (\(\      (\(\    (\(\    (\(\      (\(\
 (='.') ─> (='.')  (='.')  (='.') ─> (='.')
O(_")")   O(_")") O(_")") O(_")")   O(_")")
          ────────────────────────
方法
Modifier and TypeMethod and Description
booleanadd(E e) 如果可以无需违反容量限制立即插入该队列中的指定元素,如果当前没有空间,则在成功后返回并抛出IllegalStateException。
Eelement() Retrieves, but does not remove, the head of this queue.
booleanoffer(E e)Inserts the specified element into this queue if it is possible to do so immediately without violating capacity restrictions.
Epeek()Retrieves, but does not remove, the head of this queue, or returns null if this queue is empty.
Epoll() 出队操作,或者如果该队列为空,则返回空。
Eremove()Retrieves and removes the head of this queue.
  • offer()和add()的区别
    add()和offer()都是向队列中添加一个元素。但是如果想在一个满的队列中加入一个新元素,调用 add() 方法就会抛出一个 unchecked 异常,而调用 offer() 方法会返回 false。可以据此在程序中进行有效的判断!
  • peek()和element()的区别
    peek()和element()都将在不移除的情况下返回队头,但是peek()方法在队列为空时返回null,调用element()方法会抛出NoSuchElementException异常。
  • poll()和remove()的区别
    poll()和remove()都将移除并且返回对头,但是在poll()在队列为空时返回null,而remove()会抛出NoSuchElementException异常。

Deque

允许两头都进,两头都出,这种队列叫双端队列(Double Ended Queue),学名Deque

Java集合提供了接口Deque来实现一个双端队列,它的功能是:

  • 既可以添加到队尾,也可以添加到队首;
  • 既可以从队首获取,又可以从队尾获取。
Queue和Deque

Deque继承自Queue,

QueueDeque
添加元素到队尾add(E e) / offer(E e)addLast(E e) / offerLast(E e)
取队首元素并删除E remove() / E poll()E removeFirst() / E pollFirst()
取队首元素但不删除E element() / E peek()E getFirst() / E peekFirst()
添加元素到队首addFirst(E e) / offerFirst(E e)
取队尾元素并删除E removeLast() / E pollLast()
取队尾元素但不删除E getLast() / E peekLast()

Deque接口实际上扩展自Queue,因此,Queue提供的add()/offer()方法在Deque中也可以使用,但是,使用Deque,最好不要调用offer(),而是调用offerLast()。如果直接写deque.offer(),我们就需要思考,offer()实际上是offerLast(),我们明确地写上offerLast(),不需要思考就能一眼看出这是添加到队尾。因此,使用Deque,推荐总是明确调用offerLast()/offerFirst()或者pollFirst()/pollLast()方法。

ArrayDeque与LinkList

Deque是一个接口,它的实现类有ArrayDequeLinkedList

LinkedList是一个全能选手,它即是List,又是Queue,还是Deque。但是我们在使用的时候,总是用特定的接口来引用它,这是因为持有接口说明代码的抽象层次更高,而且接口本身定义的方法代表了特定的用途。

区别:

ArrayDeque:

  • 数组结构
  • 插入元素不能为null
  • 无法确定数据量时,后期扩容会影响效率

LinkList:

  • 链表结构
  • 插入元素能为null
  • 无法确定数据量时,有更好表现

参考资料

https://www.liaoxuefeng.com/wiki/1252599548343744/1265122668445536

https://docs.oracle.com/javase/8/docs/api/java/util/Queue.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值