Java中的队列

关于队列

队列(Queue)是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部,当我们获取一个元素时,它会返回队列头部的元素。

如下图,可以把队列比作成排队领票的一队人,先到的人先领票,后到的人后拿票。

队列可以同时对头和尾进行操作,如果我定义一个数组,我可以取出头a[o],也可以在a[5]后面添加新的元素a[6]。

 

关于 Queue 接口

队列的方法摘要

修饰语和类型 方法和说明
boolean add(E e)
          将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException
E element()
          获取,但是不移除此队列的头。
boolean offer(E e)
          将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。
E peek()
          获取但不移除此队列的头;如果此队列为空,则返回 null
E poll()
          获取并移除此队列的头,如果此队列为空,则返回 null
E remove()
          获取并移除此队列的头。

 

 

 

 

 

 

 

 

 

 

 

实例

这里我暂且用数组来实现栈

ps:我这里用了java的泛型,关于java的泛型在前面的随笔里我有介绍。

 

 1 import java.util.Arrays;
 2 
 3 public class Queue<E> {
 4 
 5     // 新建一个长度为0的数组
 6     private Object[] src = new Object[0];
 7 
 8     // 将数据加入队列
 9     public void add(E s) {
10         // 复制src数组,长度为原数组的长度+1
11         E[] e = (E[]) Arrays.copyOf(src, src.length + 1);
12         // 将传入的数据给新数组的最后一个元素
13         e[e.length - 1] = (E) s;
14         src = e;
15     }
16 
17     // 查看队列头的数据
18     public E peek() {
19         //判断队列是否为空
20         if(src.length==0) {
21             return null;
22         }
23         // 返回src数组的第一个元素
24         return (E) src[0];
25     }
26 
27     // 弹出队列头的数据[移除]
28     public E poll() {
29         if (src.length == 0) {
30             return null;
31         }
32         //将src数组复制给新数组,方便弹出队列头的数据
33         E[] s = (E[]) Arrays.copyOf(src, src.length);
34         //新建一个长度为原数组长度-1的数组,将原数组去掉第一个元素后复制给新数组
35         Object[] st =new Object[src.length - 1];
36         for (int i = 0; i < st.length; i++) {
37             st[i] = (E) src[i + 1];
38         }
39         src = st;
40         return s[0];
41     }
42 
43     // 获得队列的长度
44     public int size() {
45         return src.length;
46     }
47 
48     // 判断队列是否为空
49     public boolean empty() {
50         return src.length == 0;
51     }
52     
53     public static void main(String[] args) {
54         Queue<String> q=new Queue<String>();
55         
56         //将数据加入队列
57         q.add("AA");
58         q.add("BB");
59         q.add("CC");
60         q.add("DD");
61         
62         System.out.println("队列头的数据为:"+q.peek());
63         
64         System.out.println("队列的长度为:"+q.size());
65         
66         while(!q.empty()) {
67             System.out.println("弹出数据:"+q.poll());
68         }
69     }
70 }

运行结果:

队列头的数据为:AA
队列的长度为:4
弹出数据:AA
弹出数据:BB
弹出数据:CC
弹出数据:DD

 

结果分析

遵循了队列 ‘ 先进先出 ’ 的特性,输入 AA、BB、CC、DD,弹出 AA、BB、CC、DD。

根据这个特性,队列在某些时候是必不可少的。

 

posted @ 2018-05-25 18:46  jw1102  阅读(184)  评论(0编辑  收藏  举报