zoukankan      html  css  js  c++  java
  • 从头认识java-15.6 队列(Queue)

    这一章节我们来讨论一下队列(Queue)。

    1.什么是队列?

    队列是一种特殊的线性表,特殊之处在于它仅仅同意在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样。队列是一种操作受限制的线性表。

    2.特性

    (1)元素是有序的

    (2)元素是先进先出

    3.java里面的实现类:Linkedlist和PriorityQueue,两者之间性能不存在区别,区别的地方是排序的行为。

    package com.ray.ch14;
    
    import java.util.LinkedList;
    import java.util.PriorityQueue;
    import java.util.Queue;
    
    public class Test {
    
    	public static <T> void test(Queue<T> queue, Generator<T> generator,
    			int count) {
    		for (int i = 0; i < count; i++) {
    			queue.add(generator.next());
    		}
    		while (queue.peek() != null) {
    			System.out.print(queue.remove() + " ");
    		}
    		System.out.println();
    	}
    
    	public static void main(String[] args) {
    		test(new LinkedList<String>(), new MyGenerator(), 10);
    		test(new PriorityQueue<String>(), new MyGenerator(), 10);
    	}
    }
    
    interface Generator<T> {
    	T next();
    }
    
    class MyGenerator implements Generator<String> {
    	private String str = "one two three four five six seven eight nine ten eleven";
    
    	private int index = 0;
    
    	@Override
    	public String next() {
    		if (index > str.split(" ").length) {
    			return "";
    		} else {
    			return str.split(" ")[index++];
    		}
    	}
    }
    


    输出:

    one two three four five six seven eight nine ten
    eight five four nine one seven six ten three two

    4.优先级队列

    排序对象实现Comparable接口就可以。

    package com.ray.ch14;
    
    import java.util.PriorityQueue;
    import java.util.Random;
    
    public class Test {
    
    	private static PriorityQueue<MyClass> priorityQueue = new PriorityQueue<MyClass>();
    
    	public static PriorityQueue<MyClass> test(int count) {
    		for (int i = 0; i < count; i++) {
    			priorityQueue.add(new MyClass(new Random().nextInt(10)));
    		}
    		return priorityQueue;
    	}
    
    	public static void main(String[] args) {
    		System.out.println(test(10));
    	}
    }
    
    class MyClass implements Comparable<MyClass> {
    	private int pri = 0;
    
    	public MyClass(int pri) {
    		this.pri = pri;
    	}
    
    	@Override
    	public int compareTo(MyClass myClass) {
    		if (this.pri < myClass.pri) {
    			return -1;
    		} else {
    			if (this.pri == myClass.pri) {
    				return 0;
    			} else {
    				return 1;
    			}
    		}
    	}
    
    	@Override
    	public String toString() {
    		return this.pri + "";
    	}
    }
    


    输出:

    [0, 1, 3, 3, 2, 5, 5, 6, 6, 7]

    5.双向队列

    特点:能够在不论什么一段加入或者删除元素。

    因为在现有的java 里面没有实现双向队列的接口。可是在Linkedlist里面事实上已经模拟出来了。因此我们使用组合来模拟一下。

    class Deque<T> {
    	private LinkedList<T> linkedList = new LinkedList<T>();
    
    	public void addFirst(T t) {
    		linkedList.addFirst(t);
    	}
    
    	public void addLast(T t) {
    		linkedList.addLast(t);
    	}
    
    	public void removeFirst() {
    		linkedList.removeFirst();
    	}
    
    	public void removeLast() {
    		linkedList.removeLast();
    	}
    }


     

    总结:这一章节主要讲述队列的概念、特点。以及优先级和双向队列。

    这一章节就到这里,谢谢。

    -----------------------------------

    文件夹

  • 相关阅读:
    HTML
    Linux 入门记录:十一、Linux 用户基础
    Linux 入门记录:十、Linux 下获取帮助
    Linux 入门记录:九、Linux 文件系统挂载管理
    Linux 入门记录:八、Linux 文件系统
    Linux 入门记录:七、fdisk 分区工具
    Linux 入门记录:六、Linux 硬件相关概念(硬盘、磁盘、磁道、柱面、磁头、扇区、分区、MBR、GPT)
    Linux 入门记录:五、vi、vim 编辑器
    Linux 入门记录:四、Linux 系统常用命令
    Linux 入门记录:三、Linux 文件基本操作管理
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7133804.html
Copyright © 2011-2022 走看看