Queue接口——高淇JAVA300讲笔记之其他容器

  • Queue:单向
    • 队列通常FIFO(先进先出)
    • 优先级队列和堆栈LIFO(后进先出) 

 

    抛出异常  特殊值

插入  add(e)           offer(e)

移除  remove()       poll()

获取  element()      peek()


 

  • Deque:双向 两端访问

  全名double-ended queue,是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。

  1、此接口扩展了Queue接口,在将双端队列用作队列时,将得到FIFO(先进先出)行为

  2、可用作LIFO(后进先出)堆栈


案例一:使用队列模拟银行存款业务

 

 1 package com.bjsxt.others.que;
 2 
 3 import java.util.ArrayDeque;
 4 import java.util.Queue;
 5 
 6 /**
 7  * 使用队列模拟银行存款业务
 8  *
 9  */
10 public class Demo01 {
11     public static void main(String[] args) {
12         Queue<Request> que = new ArrayDeque<Request>();
13         //模拟排队情况
14         for(int i=0;i<10;i++) {
15             final int num = i;  //匿名内部类对象只能访问final修饰的变量
16             que.offer(new Request() {
17                 
18                 @Override
19                 public void deposit() {
20                     System.out.println("第"+num+"个人,办理存款业务,存款额度为:"+(Math.random()*10000));
21                 }
22             });
23         }
24         
25         dealWith(que);
26         
27     }
28     //处理业务
29     public static void dealWith(Queue<Request> que) {
30         Request req = null;
31         while(null != (req=que.poll())) {
32             req.deposit();
33         }
34     }
35 }
36 
37 interface Request{
38     //存款
39     void deposit();
40 }

 

运行结果:

第0个人,办理存款业务,存款额度为:9161.997129099092
第1个人,办理存款业务,存款额度为:5583.8986325147125
第2个人,办理存款业务,存款额度为:6777.270259656995
第3个人,办理存款业务,存款额度为:9488.415995041527
第4个人,办理存款业务,存款额度为:2076.1692681219834
第5个人,办理存款业务,存款额度为:6296.16078836921
第6个人,办理存款业务,存款额度为:1778.08272104238
第7个人,办理存款业务,存款额度为:5271.919761422389
第8个人,办理存款业务,存款额度为:8782.338403081516
第9个人,办理存款业务,存款额度为:628.3618807054859

案例二:使用队列实现自定义堆栈

先写一个自定义的堆栈类,具有压栈、弹栈、获取方法。

 1 package com.bjsxt.others.que;
 2 
 3 import java.util.ArrayDeque;
 4 import java.util.Deque;
 5 
 6 /**
 7  * 使用队列实现自定义堆栈
 8  * 1、弹
 9  * 2、压
10  * 3、获取头
11  *
12  */
13 public class MyStack<E> {
14     //容器
15     private Deque<E> container = new ArrayDeque<E>();
16     //容量
17     private int cap;
18     public MyStack(int cap) {
19         super();
20         this.cap = cap;
21     }
22     
23     //压栈
24     public boolean push(E e) {
25         if(container.size()+1>cap) {
26             return false;
27         }
28         return container.offerLast(e);
29     }
30     //弹栈
31     public E pop() {
32         return container.pollLast();
33     }
34     //获取
35     public E peek() {
36         return container.peekLast();
37     }
38     
39     public int size() {
40         return this.container.size();
41     }
42 }

然后测试一下这个堆栈:

 1 package com.bjsxt.others.que;
 2 
 3 /**
 4  * 测试自定义堆栈
 5  *
 6  */
 7 public class Demo02 {
 8     public static void main(String[] args) {
 9         MyStack<String> backHistory = new MyStack<String>(3);
10         backHistory.push("www.baidu.com");
11         backHistory.push("www.google.com");
12         backHistory.push("www.sina.com");
13         backHistory.push("www.bjsxt.cn");
14         
15         System.out.println("大小:"+backHistory.size());
16         
17         //遍历
18         String item = null;
19         while(null != (item=backHistory.pop())) {
20             System.out.println(item);
21         }
22     }
23 }

运行结果:

大小:3
www.sina.com
www.google.com
www.baidu.com

 

posted on 2018-01-21 23:39  爱游泳的小飞象  阅读(136)  评论(0编辑  收藏  举报

导航