java 队列、优先级队列、双向队列示例演示代码

package org.rui.collection2.queues;

import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.PriorityBlockingQueue;

import org.rui.generics.anonymity.Generator;
/**
 * 下面涉及Queue实现的大部分操作的基本示例
 * 可以看到除了优先队列,Queue将精确地按照元素被置于Queue中的顺序产生它们
 * @author lenovo
 *
 */
public class QueueBeHavior {
	private static int count=10;
	static<T> void test(Queue<T> queue,Generator<T> gen)
	{
		for(int i=0;i<count;i++)
		{
			//T temp=gen.next();
			//System.out.println(temp);
			queue.offer(gen.next());
		}

		while(queue.peek()!=null)
			System.out.print(queue.remove()+"  ");
		    System.out.println();
	}

	static class Gen implements Generator<String>
	{
		String[] s=
		("one tow three four five six seven eight nine ten".split(" "));
		int i;

		public String next()
		{
			return s[i++];
		}
	}

	public static void main(String[] args)
	{
		test(new LinkedList<String>(),new Gen());
		test(new PriorityQueue<String>(),new Gen());
		test(new ArrayBlockingQueue<String>(count),new Gen());
		test(new ConcurrentLinkedQueue<String>(),new Gen());
		test(new LinkedBlockingQueue<String>(),new Gen());
		test(new PriorityBlockingQueue<String>(),new Gen());
	}
}
/**output:
one  tow  three  four  five  six  seven  eight  nine  ten
eight  five  four  nine  one  seven  six  ten  three  tow
one  tow  three  four  five  six  seven  eight  nine  ten
one  tow  three  four  five  six  seven  eight  nine  ten
one  tow  three  four  five  six  seven  eight  nine  ten
eight  five  four  nine  one  seven  six  ten  three  tow
 */
package org.rui.collection2.queues;

import java.util.PriorityQueue;

/**
 * 优先级队列
 * 主要和次要的优先级排序
 * 该列表的排序顺序也是通过实现Comparable而进行控制的
 * @author lenovo
 *
 */
public class ToDoList  extends PriorityQueue<ToDoList.ToDoItem>
{

	static class ToDoItem implements Comparable<ToDoItem>
	{
		private char primary;//主要的
		private int secondary;//二
		private String item;

		public ToDoItem(String item,char primary, int secondary)
		{
			this.primary = primary;
			this.secondary = secondary;
			this.item = item;
		}

		public int compareTo(ToDoItem o)
		{
			if(primary>o.primary)//先比较主要的
				return +1;
			if(primary==o.primary)
				if(secondary>o.secondary) //再比较次要的
					return +1;
				else if(secondary==o.secondary)
					return 0;
			return -1;
		}

		public String toString()
		{
			return Character.toString(primary)+secondary+": "+item;
		}
	}

	public void add(String td,char pri,int sec)
	{
		super.add(new ToDoItem(td, pri, sec));
	}

	public static void main(String[] args) {
		ToDoList to=new ToDoList();
		to.add("Empty Trash",'C',4);
		to.add("Feed dog",'A',2);
		to.add("Feed bird",'B',7);
		to.add("Mow lawn",'C',3);
		to.add("Water lawn",'A',1);
		to.add("Feed cat",'B',1);

		while(!to.isEmpty())
		{
			System.out.println(to.remove());
		}
	}
}
/**output:
A1: Water lawn
A2: Feed dog
B1: Feed cat
B7: Feed bird
C3: Mow lawn
C4: Empty Trash
 */
package org.rui.collection2.queues;

import java.util.LinkedList;

/**
 * 双向队列就是一个队列,但是你可以在任何一端添加或移除元素,
 * LinkedList无法实现这样的接口,但可以使用组合来创建一个Deque类,
 * @author lenovo
 *
 * @param <T>
 */

public class Deque<T>  {
	private LinkedList<T> deque=new LinkedList<T>();
	public void addFirst(T e){deque.addFirst(e);}
	public void addLast(T e){deque.addLast(e);}
	public T getFirst(T e){return deque.getFirst();}
	public T getLast(T e){return deque.getLast();}
	public T removeFirst(){return deque.removeFirst();}
	public T removeLast(){return deque.removeLast();}
	public int size(){return deque.size();}
	public String toString(){return deque.toString();}
	//and other methods as necessary............

	////////////////////////////////////////////////
	public static void fillTest(Deque<Integer> de)
	{
		for(int i=10;i<17;i++)
			de.addFirst(i);
		for(int i=50;i<55;i++)
			de.addLast(i);
	}
	public static void main(String[] args) {
		Deque<Integer> deque=new Deque<Integer>();
		fillTest(deque);
		System.out.println(deque);
		while(deque.size()!=0)
			System.out.print(deque.removeFirst()+"  ");
		System.out.println();
		fillTest(deque);
		while(deque.size()!=0)
			System.out.print(deque.removeLast()+"  ");
		System.out.println();

	}

}
/** output:
[16, 15, 14, 13, 12, 11, 10, 50, 51, 52, 53, 54]
16  15  14  13  12  11  10  50  51  52  53  54
54  53  52  51  50  10  11  12  13  14  15  16
*/

java 队列、优先级队列、双向队列示例演示代码

时间: 2024-08-25 07:24:09

java 队列、优先级队列、双向队列示例演示代码的相关文章

C++ Double Ended Queues(双向队列)

双向队列和向量很相似,但是它允许在容器头部快速插入和删除(就像在尾部一样). Constructors 创建一个新双向队列 Operators 比较和赋值双向队列 assign() 设置双向队列的值 at() 返回指定的元素 back() 返回最后一个元素 begin() 返回指向第一个元素的迭代器 clear() 删除所有元素 empty() 返回真如果双向队列为空 end() 返回指向尾部的迭代器 erase() 删除一个元素 front() 返回第一个元素 get_allocator()

Python_Day_05 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuqe.Queue)

Counter(计数器) 是一个字典的子类,存储形式同样为字典,其中存储的键为字典的元素,值为元素出现的次数,在使用之前我们需要先导入文件 import collections 初始化一个计数器 import collections # 初始化一个计数器 c = collections.Counter('sldfjoaoaufdlfuaof') print(c) # Counter({'f': 4, 'o': 3, 'a': 3, 'd': 2, 'u': 2, 'l': 2, 'j': 1,

Java 模拟队列(一般队列、双向队列、优先级队列)

队列: 先进先出,处理类似排队的问题,先排的,先处理,后排的等前面的处理完了,再处理 对于插入和移除操作的时间复杂度都为O(1),从后面插入,从前面移除 双向队列: 即在队列两端都可以insert和remove:insertLeft.insertRight,removeLeft.removeRight 含有栈和队列的功能,如去掉insertLeft.removeLeft,那就跟栈一样了:如去掉insertLeft.removeRight,那就跟队列一样了 一般使用频率较低,时间复杂度 O(1)

java面向对象的栈 队列 优先级队列的比较

栈 队列 有序队列数据结构的生命周期比那些数据库类型的结构(比如链表,树)要短得多.在程序操作执行期间他们才被创建,通常用他们去执行某项特殊的任务:当完成任务之后,他们就会被销毁.这三个数据结构还有一个特点就是访问是受到限制的,即在特定时刻只有一个数据项可以被读取或者被删除,但是所谓的移除并不是真的删除,数据项依然在这些数据结构中,只不过因为指针已经指向其他数据项,没有办法访问到,当添加新的数据项时,当初移除的数据项被替代从而永远消失. 栈 队列 优先级队列的模拟思想 1.栈:栈遵循先进后出(F

java PriorityQueue(优先级队列)

先进先出描述了最典型的队列.队列规则是值在给定一组队列中的元素的情况下,确定下一个弹出队列的元素的规则,先进先出声明的是下一个元素应该是等待时间最长的元素 优先级队列声明下一个弹出的元素是最需要的元素(具有最高优先级),当在PriorityQueue调用offer()方法插入一个对象时,这个对象就会在队列中被排序,默认的排序将使用队列中的自然排序,但是可以通过提供自己的Comparator来修改这个顺序,PriorityQueue可以确保当你调用peek(),poll()和remove()方法时

深入浅出 Java Concurrency (24): 并发容器 part 9 双向队列集合 Deque[转]

有一段时间没有更新了.接着上节继续吧. Queue除了前面介绍的实现外,还有一种双向的Queue实现Deque.这种队列允许在队列头和尾部进行入队出队操作,因此在功能上比Queue显然要更复杂.下图描述的是Deque的完整体系图.需要说明的是LinkedList也已经加入了Deque的一部分(LinkedList是从jdk1.2 开始就存在数据结构). Deque在Queue的基础上增加了更多的操作方法. 从上图可以看到,Deque不仅具有FIFO的Queue实现,也有FILO的实现,也就是不仅

Java 模拟队列(一般队列、双端队列、优先级队列)

队列: 先进先出,处理类似排队的问题,先排的.先处理,后排的等前面的处理完了,再处理 对于插入和移除操作的时间复杂度都为O(1).从后面插入,从前面移除 双端队列: 即在队列两端都能够insert和remove:insertLeft.insertRight.removeLeft.removeRight 含有栈和队列的功能,如去掉insertLeft.removeLeft,那就跟栈一样了.如去掉insertLeft.removeRight.那就跟队列一样了 一般使用频率较低,时间复杂度 O(1)

【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现

  本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型   队列同样是一种特殊的线性表,其插入和删除的操作分别在表的两端进行,队列的特点就是先进先出(First In First Out).我们把向队列中插入元素的过程称为入队(Enqueue),删除元素的过程称为出队(Dequeue)并把允许入队的一端称为队尾,允许出的的一端称为队头,没有任何元素的队列

Java并发编程:阻塞队列

在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便.今天我们来讨论另外一类容器:阻塞队列. 在前面我们接触的队列都是非阻塞队列,比如PriorityQueue.LinkedList(LinkedList是双向链表,它实现了Dequeue接口). 使用非阻塞队列的时候有一个很大问题就是:它不会对当前线程产生阻塞,那么在面对类似消费者