1. 程式人生 > >Java 從入門到進階之路(二十六)

Java 從入門到進階之路(二十六)

在之前的文章我們介紹了一下 Java 中的  集合框架中的Collection 的子介面 List,本章我們來看一下 Java 集合框架中的Collection 的子介面 Queue。

在之前我們講 List 和 Set 的時候可以通過下標的形式獲取想要的元素,在 Collection 中其實還有 Queue 這個子介面,就是佇列的意思。

佇列可以形象的比喻為在火車站排隊買票,先進先出,後進後出,接下來我們就用程式碼來實現一下:

 1 import java.util.LinkedList;
 2 import java.util.Queue;
 3 
 4 /**
 5  * java.util.Queue
 6  * 佇列
 7  * 佇列也可以存放一組元素,但是存取元素必須
 8  * 遵循:先進先出原則
 9  */
10 
11 public class Main {
12     public static void main(String[] args) {
13         /**
14          * LinkedList 也實現了佇列介面,
15          * 因為它可以儲存一組元素
16          * 並且首尾增刪快,正好符合佇列的特點
17          */
18         Queue<String> queue = new LinkedList<String>();
19         /**
20          * boolean offer(E e)
21          * 入隊操作,向隊尾追加一個新元素
22          */
23         queue.offer("one");
24         queue.offer("two");
25         queue.offer("three");
26         queue.offer("four");
27         System.out.println(queue.size()); // 4
28         System.out.println(queue); // [one, two, three, four]
29 
30         /**
31          * E peek()
32          * 引用隊首元素,但是不做出隊操作
33          * 返回值是該元素
34          */
35         String peek = queue.peek();
36         System.out.println(peek); // one
37         System.out.println(queue); // [one, two, three, four]
38 
39         /**
40          * E poll()
41          * 出隊操作,從隊首獲取元素,獲取後該元素
42          * 就從佇列中被刪除
43          * 返回值是該元素
44          */
45         String old = queue.poll();
46         System.out.println(old); // one
47         System.out.println(queue); // [two, three, four]
48 
49         /**
50          * 迴圈獲取每個元素
51          * 不能通過 i++ 的形式,因為每次取出一個後 size 會有變化
52          */
53         for (int i = queue.size(); i > 0; i--) {
54             System.out.println(queue.poll()); // two three four
55         }
56         // 用 while 更好點
57         while (queue.size() > 0) {
58             System.out.println(queue.poll()); // two three four
59         }
60     }
61 }

佇列在程式設計中一般不會用到,除非有特殊規定需要先後順序的時候採用,例如在玩遊戲伺服器爆滿要排隊進入遊戲的時候,當然得排除會員插隊現象。

下面我們再來看一下另一個概念:棧

棧:儲存一組元素,但是存取元素必須遵循先進後出的原則,通常為了實現後退這類功能會使用棧。

在現實生活中子彈上膛打出就是一個很經典的棧。

 

 

 在上圖中是佇列的一些方法,如果我們把右邊的方法去掉不用,僅左邊的方法就是一個棧,先進後出。

在棧中還有自己的方法 push 和 pop,具體操作如下:

 1 import java.util.Deque;
 2 import java.util.LinkedList;
 3 
 4 public class Main {
 5     public static void main(String[] args) {
 6         /**
 7          * Java.util.Deque
 8          * 雙端佇列,兩端都可以進出隊
 9          * 當呼叫從一端進出佇列操作時,就形成了棧介面
10          * 因此,雙端佇列為棧提供了兩個方法
11          * push,pop
12          */
13         Deque<String> stack = new LinkedList<String>();
14         stack.push("one");
15         stack.push("two");
16         stack.push("three");
17         stack.push("four");
18         System.out.println(stack.size()); // 4
19         System.out.println(stack); // [four, three, two, one]
20 
21         /**
22          * 獲取第一個元素
23          */
24         String peek = stack.peek();
25         System.out.println(peek); // four
26         System.out.println(stack); // [four, three, two, one]
27 
28         /**
29          * 出棧操作
30          */
31         String old = stack.pop();
32         System.out.println(old); // four
33         System.out.println(stack); // [three, two, one]
34 
35         /**
36          * 迴圈出棧
37          */
38         while (stack.size() > 0) {
39             System.out.println(stack.pop()); // three two one
40         }
41     }
42 }

佇列和棧的區別在於一個先進先出,一個先進後出,很多方法都是通用的,需要自己在實際開發應用中使