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