欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

队列Queue

程序员文章站 2024-03-18 08:06:40
...

定义

队列Queue也是Collection的一个子接口,它也是常用的数据结构。

可以将队列看成特殊的线性表,队列限制对线性表的访问方式:
只能从一端添加(offer)元素,从另一端取出(poll)元素。

队列遵循先进先出(FIFO )的原则,实现类LinkedList也实现了该接口,选择此类实现Queue的原因在于Queue经常要进行添加和删除操作,而LinkedList在这方面效率比较高。

应用

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

public class QueueDemo {

	public static void main(String[] args) {
		// 定义一个队列q
		Queue<String> q = new LinkedList<String>();
		/*
		 * boolean offer(E e) 
		 * 将指定的元素插入到此队列中。  
		 * 即:从队尾进
		 */
		q.offer("aa");
		q.offer("bb");
		q.offer("cc");
		System.out.println("队列q:"+q);//队列q:[aa, bb, cc]
		/*
		 * E peek() 
		 * 检索但不删除此队列的头,如果此队列为空,则返回 null 。  
		 * 即:查看队首元素
		 */
		String s = q.peek();
		System.out.println("队首元素:"+s);//队首元素:aa
		/*
		 * E poll() 
		 * 检索并删除此队列的头,如果此队列为空,则返回 null 。  
		 * 即:移除队首元素
		 */
		String s1 = q.poll();
		System.out.println("移除的元素:"+s1);//移除的元素:aa
		System.out.println("移除后的队列:"+q);//移除后的队列:[bb, cc]
		
		/*
		 * 注意:
		 * 当对列为空时,peek()的返回值为null
		 * 所以当我们进行移除队首操作时,最好先使用peek方法,
		 * 查看队首是否为null
		 */
		while(q.peek()!=null){
			String s2 = q.poll();
			System.out.println("移除的元素:"+s2);
			/* 输出:
			 * 移除的元素:bb
			 * 移除的元素:cc
			 */
		}

	}

}

Queue的子接口

Deque:支持两端元素插入和移除的线性集合,Queue的子接口,定义了"双端队列"的数据结构
即:两端都可以进行offer和poll操作

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

public class DequeDemo {

	public static void main(String[] args) {
		// 定义一个双端队列dq
		Deque<String> dq = new LinkedList<String>();
		/*
		 * boolean offerFirst(E e) 
		 * 在此deque的前面插入指定的元素 
		 */
		dq.offerFirst("aa");
		dq.offerFirst("bb");
		dq.offerFirst("cc");
		System.out.println(dq);
		//输出:[cc, bb, aa]
		/*
		 * boolean offerLast(E e) 
		 * 在此deque的末尾插入指定的元素 
		 */
		dq.offerLast("dd");
		dq.offerLast("ee");
		System.out.println(dq);
		//输出:[cc, bb, aa, dd, ee]
		/*
		 * E peekFirst() 检索,但不删除,此deque的第一个元素 ----即 查看队首元素
		 * E peekLast() 检索但不删除此deque的最后一个元素 ----即 查看队尾元素
		 */
		System.out.println("队首元素:"+dq.peekFirst());//输出:队首元素:cc
		System.out.println("队尾元素:"+dq.peekLast());//输出:队尾元素:ee
		/*
		 * E pollFirst() 检索并删除此deque的第一个元素 ----即 移除队首元素
		 * E pollLast() 检索并删除此deque的最后一个元素 ----即 移除队尾元素
		 */
		System.out.println("移除的队首元素:"+dq.pollFirst());//输出:移除的队首元素:cc
		System.out.println("移除队首元素后的队列:"+dq);//输出:移除队首元素后的队列:[bb, aa, dd, ee]
		System.out.println("移除的队尾元素:"+dq.pollLast());//输出:移除的队尾元素:ee
		System.out.println("移除队尾元素后的队列:"+dq);//输出:移除队尾元素后的队列:[bb, aa, dd]
	}

}