Java中的Queue(队列)和Duque(栈)

这篇博客探讨了Java中的Queue和Deque数据结构。Queue是遵循先进先出(FIFO)原则的接口,常用方法包括offer、poll和peek。LinkedList实现了Queue接口。Deque是Queue的子接口,适用于栈操作,遵循先进后出(FILO)原则,提供了push、pop和peek方法。ArrayDeque是基于数组的双端队列,可以作为栈和队列使用,但不是线程安全的,性能优于Stack和LinkedList。

Deque接口继承了Queue的接口规范。LinkedList、ArrayDeque都是实现Deque接口。

       Queue<-----Duque<-----LinkedList、ArrayDeque

队列(Queue)

      是常用的数据结构,可以将队列看成特殊的线性表,队列限制了对线性表的访问方式:只能从线性表的一端添加(offer)元素,从另一端取出(poll)元素。Queue接口:在包 java.util.Queue。
1)队列遵循先进先出原则:FIFO(First Input First Output)队列不支持插队,插队是不道德的。
2)JDK 中提供了 Queue 接口,同时使得 LinkedList 实现了该接口(选择 LinkedList 实现Queue 的原因在于 Queue 经常要进行插入和删除的操作,而 LinkedList 在这方面效率较高) 。

常用方法:
  ①boolean offer(E e):将一个对象添加至队尾,如果添加成功则返回 true。
  ②poll():从队列中取出元素,取得的是最早的 offer 元素,从队列中取出元素后,该元素会从队列中删除。若方法返回 null 说明 队列中没有元素了。
  ③peek():获取队首的元素(不删除该元素!)

package day0607;

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

/**
 * @author Limi
 * Queue 队列     先进先出
 */
public class Demo04 {
	public static void main(String[] args) {
		Queue<Integer> queue = new LinkedList<Integer>();
		for(int i=0;i<=10;i++){
			queue.offer(i);
		}
		System.out.println(queue);
		
		/*
		 * peek():获取队首的元素(不删除该元素!)
		 */
		System.out.println("peek():"+queue.peek());
		
		/*
		 * poll():从队列中取出元素,取得的是最早的 offer 元素,从队列中取出元素后,
		 * 该元素会从队列中删除。若方法返回 null 说明 队列中没有元素了。
		*/
		Integer integer = null;
		while((integer=queue.poll()) != null){
			System.out.print(integer);
		}
		
		System.out.println("\npeek():"+queue.peek());
	}
}

栈 (Deque)

       是常用的数据结构, 是 Queue 队列的子接口, 因此 LinkedList 也实现了 Deque接口。栈将双端队列限制为只能从一端入队和出队,对栈而言即是入栈和出栈。子弹夹就是一种栈结构。在包 java.util.Deque 下。
1)栈遵循先进后出的原则:FILO(First Input Last Output)。
2)常用方法:
  ①push:压入,向栈中存入数据。
  ②pop:弹出,从栈中取出数据。
  ③peek:获取栈顶位置的元素,但不取出。

    注意: 我们在使用 pop 获取栈顶元素之前, 应现使用 peek 方法获取该元素,确定该元素不为 null 的情况下才应该将该元素从栈中弹出”,否则若栈中没有元素后,我们调用 pop 会抛出异常“NoSuchElementException” 。

package day0607;

import java.util.Deque;
import java.util.LinkedList;

/**
 * @author Limi
 * 栈 (Deque) 双端队列  先进后出
 */
public class Demo05 {

	public static void main(String[] args) {
		Deque<String> deque = new LinkedList<String>();
		for(int i=1;i<6;i++){
			deque.push(i+"");//压入,向栈中存入数据。
		}
		System.out.println(deque);
		/*
		 * peek:获取栈顶位置的元素,但不取出。
		 * 注意事项: 我们在使用 pop 获取栈顶元素之前, 应现使用 peek 方法获取该元素,
		 * 确定该元素不为 null 的情况下才应该将该元素从栈中弹出” , 否则若栈中没有元
		 * 素后,我们调用 pop 会抛出异常“NoSuchElementException” 。
		 */
		while(deque.peek()!=null){
			//pop:弹出,从栈中取出数据。
			System.out.print(deque.pop());
		}
		System.out.println("\n"+deque);
	}

}

      ArrayDeque集合是Deque接口的实现类,它是一个基于数组的双端队列,创建Deque时同样可以指定一个numElements参数,该参数用于指定Object[]数组的长度;如果不指定该参数,Deque底层数组长度为16。 ArrayDeque集合既可当队列使用,也可当栈使用。

   1)ArrayDeque有两个类属性,head和tail,两个指针。

   2)ArrayDeque通过一个数组作为载体,其中的数组元素在add等方法执行时不移动,发生变化的只是head和tail指针,而且指针是循环变化,数组容量不限制。

   3)offer方法和add方法都是通过其中的addLast方法实现,每添加一个元素,就把元素加到数组的尾部,此时,head指针没有变化,而tail指针加一,因为指针是循环加的,所以当tail追上head((this.tail = this.tail + 1 & this.elements.length - 1) == this.head)时,数组容量翻一倍,继续执行。

   4)remove方法和poll方法都是通过其中的pollFirst方法实现,每移除一个元素,该元素所在位置变成null,此时,tail指针没有变化,而head指针加一,当数组中没有数据时,返回null。

   5)因为ArrayDeque不是线程安全的,所以,用作堆栈时快于 Stack,在用作队列时快于 LinkedList。

转载于:https://my.oschina.net/u/2409704/blog/916720

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值