1.Queue接口:

public interface Queue<E> {
int getSize();
boolean isEmpty();
void enqueue(E e);
E dequeue();
E getFront();
}

2.使用Array数组实现ArrayQueue:

public class ArrayQueue<E> implements Queue<E> {

    private Array<E> array;

    public ArrayQueue(int capacity){
array = new Array<>(capacity);
} public ArrayQueue(){
array = new Array<>();
} @Override
public int getSize(){
return array.getSize();
} @Override
public boolean isEmpty(){
return array.isEmpty();
} public int getCapacity(){
return array.getCapacity();
} @Override
public void enqueue(E e){
array.addLast(e);
} @Override
public E dequeue(){
return array.removeFirst();
} @Override
public E getFront(){
return array.getFirst();
} @Override
public String toString(){
StringBuilder res = new StringBuilder();
res.append("Queue: ");
res.append("front [");
for(int i = 0 ; i < array.getSize() ; i ++){
res.append(array.get(i));
if(i != array.getSize() - 1)
res.append(", ");
}
res.append("] tail");
return res.toString();
} public static void main(String[] args){
ArrayQueue<Integer> queue = new ArrayQueue<>();
for(int i = 0 ; i < 10 ; i ++){
queue.enqueue(i);
System.out.println(queue);
if(i % 3 == 2){
queue.dequeue();
System.out.println(queue);
}
}
}
}

3.使用LinkedList链表实现LinkedListQueue:

public class LinkedListQueue<E> implements Queue<E> {

    private class Node{
public E e;
public Node next; public Node(E e, Node next){
this.e = e;
this.next = next;
} public Node(E e){
this(e, null);
} public Node(){
this(null, null);
} @Override
public String toString(){
return e.toString();
}
} private Node head, tail;
private int size; public LinkedListQueue(){
head = null;
tail = null;
size = 0;
} @Override
public int getSize(){
return size;
} @Override
public boolean isEmpty(){
return size == 0;
} @Override
public void enqueue(E e){
if(tail == null){
tail = new Node(e);
head = tail;
}
else{
tail.next = new Node(e);
tail = tail.next;
}
size ++;
} @Override
public E dequeue(){
if(isEmpty())
throw new IllegalArgumentException("Cannot dequeue from an empty queue.");
Node retNode = head;
head = head.next;
retNode.next = null;
if(head == null)
tail = null;
size --;
return retNode.e;
} @Override
public E getFront(){
if(isEmpty())
throw new IllegalArgumentException("Queue is empty.");
return head.e;
} @Override
public String toString(){
StringBuilder res = new StringBuilder();
res.append("Queue: front ");
Node cur = head;
while(cur != null) {
res.append(cur + "->");
cur = cur.next;
}
res.append("NULL tail");
return res.toString();
} public static void main(String[] args){
LinkedListQueue<Integer> queue = new LinkedListQueue<>();
for(int i = 1 ; i < 11 ; i ++){
queue.enqueue(i);
System.out.println(queue);
if(i % 3 == 0){
queue.dequeue();
System.out.println(queue);
}
}
}
}

4.实现循环队列LoopQueue:

public class LoopQueue<E> implements Queue<E> {

    private E[] data;
private int front, tail;
private int size; public LoopQueue(int capacity){
data = (E[])new Object[capacity + 1];
front = 0;
tail = 0;
size = 0;
} public LoopQueue(){
this(10);
} public int getCapacity(){
return data.length - 1;
} @Override
public boolean isEmpty(){
return front == tail;
} @Override
public int getSize(){
return size;
} @Override
public void enqueue(E e){
if((tail + 1) % data.length == front)
resize(getCapacity() * 2);
data[tail] = e;
tail = (tail + 1) % data.length;
size ++;
} @Override
public E dequeue(){
if(isEmpty())
throw new IllegalArgumentException("Cannot dequeue from an empty queue.");
E ret = data[front];
data[front] = null;
front = (front + 1) % data.length;
size --;
if(size == getCapacity() / 4 && getCapacity() / 2 != 0)
resize(getCapacity() / 2);
return ret;
} @Override
public E getFront(){
if(isEmpty())
throw new IllegalArgumentException("Queue is empty.");
return data[front];
} private void resize(int newCapacity){
E[] newData = (E[])new Object[newCapacity + 1];
for(int i = 0 ; i < size ; i ++)
newData[i] = data[(i + front) % data.length];
data = newData;
front = 0;
tail = size;
} @Override
public String toString(){
StringBuilder res = new StringBuilder();
res.append(String.format("Queue: size = %d , capacity = %d\n", size, getCapacity()));
res.append("front [");
for(int i = front ; i != tail ; i = (i + 1) % data.length){
res.append(data[i]);
if((i + 1) % data.length != tail)
res.append(", ");
}
res.append("] tail");
return res.toString();
} public static void main(String[] args){
LoopQueue<Integer> queue = new LoopQueue<>(5);
for(int i = 0 ; i < 10 ; i ++){
queue.enqueue(i);
System.out.println(queue);
if(i % 3 == 2){
queue.dequeue();
System.out.println(queue);
}
}
}
}

最新文章

  1. vmware安装win7提示No CD-ROM drive to use:GCDROM not loaded
  2. MIT 6.828 JOS学习笔记6. Appendix 1: 实模式(real mode)与保护模式(protected mode)
  3. java语法基本知识
  4. Windows共享内存示例
  5. java 21 - 8 复制文本文件的5种方式
  6. R中根据匹配原则将一列拆分为几列的方法
  7. button的type属性
  8. 使用WIF实现单点登录Part I——Windows Identity Foundation介绍及环境搭建 -摘自网络
  9. Restart-ServiceEx.psm1
  10. The Suspects(POJ 1611 并查集)
  11. 【转载】来自苹果的编程语言——Swift简介
  12. Git分支管理[三]
  13. Applet
  14. 11.17 flask (1)
  15. json.dump和json.dumps区别,json.load和json.loads的区别
  16. 《转》python学习(12)-列表解析
  17. ABP之仓储
  18. ant property file刷新不及时
  19. aarch64_n2
  20. 简单CSS3代码实现立方体以及3D骰子

热门文章

  1. VuePress 博客优化之开启 Algolia 全文搜索
  2. 【Calculate】Calculate Linux安装操作记录
  3. 6月25日 Django 分页 cookie、session
  4. 4月25日 python学习总结 互斥锁 IPC通信 和 生产者消费者模型
  5. 内网渗透----域环境搭建(server 2012)
  6. CF1500D Tiles for Bathroom (递推+大讨论)
  7. 解决IDEA的maven项目 添加依赖后Reimport无反应
  8. Homebrew 卸载后重新安装mysql
  9. 什么是 Spring IOC 容器?
  10. log4J——在Spring中的使用