Java基础数据结构——队列和栈

本文介绍了Java中的Queue和Deque数据结构,包括它们的FIFO/双端特性,常用方法如入队、出队、探顶,并对比了Stack的使用方式。特别强调了LinkedList在这些数据结构中的应用和注意事项。

Java基础数据结构——队列和栈


1. Queue

1.1 Queue 介绍

Queue(队列)是一种FIFO(First In First Out)的有序表,只有两个操作:

  • 入队(从队列末尾)
  • 出队(从队列头部)

超市收银台就是一个队列(先进先出)
在这里插入图片描述


1.2 Queue 使用

在 Java 中 LinkedList 类实现了 Queue 接口,因此我们可以把 LinkedList 当成 Queue 来用:
LinkedList类继承关系

import java.util.LinkedList;
import java.util.Queue;

Queue<String> queue = new LinkedList<String>();

利用以上代码,我们就创建了队列 queue。常用的入队、出队和获取栈顶元素(探顶)有以下两组方法

throw Exception返回false或null
入队add(E e)boolean offer(E e)
出队E remove()E poll()
探顶E element()E peek()
  • 当往一个有大小限制且已经满了的队列添加元素时,如果用 add() 方法就会抛出 IllegalStateException 异常,而用 offer() 方法只会返回 false
  • 当队列为空时,用 remove() 方法会抛出 NoSuchElementException 异常,而 poll() 方法只是返回 null
  • 当队列为空时,用 element() 方法会抛出 NoSuchElementException 异常,而 peek() 方法只是返回 null

注意

  • 一般情况下,推荐使用 offer(),poll(), peek()来专门操作队列;
  • 不要把 null 添加到队列中, 否则利用 poll() 方法返回 null 时,无法确定是队列中的 null 元素还是队列为空

2. Deque

2.1 Deque 介绍
首选声明 Deque 不念 ‘DQ’,而是念 ‘Deck’
Deque (Double Ended Queue) 是双端队列,与 Queue 只允许队列尾入队,队列头出队所不同,Deque 允许两头出入
我们来比较一下 QueueDeque 出队和入队的方法:

QueueDeque
入队(尾)add(E e) / boolean 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()

注意:

  • Queue 类似,add* remove get* 方法会报Exception,而 offer* poll* peek* 方法返回null
  • Queue 提供的add()/offer()方法在 Deque 中也可以使用,但是,使用 Deque,最好不要调用 offer(),而是调用offerLast()
  • 使用 Deque,推荐总是明确调用 offerLast()/offerFirst()或者 pollFirst()/pollLast()方法

Deque 是一个接口,它的实现类有 ArrayDequeLinkedList Stack,ArrayDeque,LinkedList的区别

  • 不推荐使用Vector以及其子类Stack
  • 频繁的插入、删除操作:LinkedList
  • 频繁的随机访问操作:ArrayDeque
  • 未知的初始数据量:LinkedList

3. Stack

注意,由于历史原因,我们现在使用的栈不是 java.util 包下的Stack,而是将 Deque 作为栈结构来使用!!!且作为栈使用时,只调用push()/pop()/peek()方法,不要调用addFirst()/removeFirst()/peekFirst()方法,这样代码更加清晰。

Deque<String> stack = new LinkedList();
stack.push("123");
stack.push("456");
String str1 = stack.peek();
String str = stack.pop();
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值