1. 程式人生 > >從頭認識java-15.6 隊列(Queue)

從頭認識java-15.6 隊列(Queue)

優先 tar bottom interface tails ont luci six linked

這一章節我們來討論一下隊列(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();
	}
}


總結:這一章節主要講述隊列的概念、特點。以及優先級和雙向隊列。

這一章節就到這裏,謝謝。

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

文件夾

從頭認識java-15.6 隊列(Queue)