java——数组队列 ArrayQueue
队列:
Array:
package Date_pacage;
public class Array<E> {
//叫它静态数组
//private int[] data;
private E[] data;
private int size;
//构造函数
public Array(int capacity) {
data = (E[])new Object[capacity];
size = 0;
}
//无参数的构造函数,默认数组的容量为10
public Array() {
this(10);
}
public int getSize() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public int getCapacity() {
return data.length;
}
// O(1)
public void addLast(E e) {
add(size, e);
}
// O(n)
public void addFirst(E e) {
add(0, e);
}
// O(n/2) = O(n)
public void add(int index, E e) {
if(size>=data.length)
resize(2 *data.length);
if(index<0 || index>size)
throw new IllegalArgumentException("Add failed.index is error.");
for(int i=size-1;i>=index;i--) {
data[i+1] = data[i];
}
data[index] = e;
size++;
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append(String.format("Array: size = %d, capacity = %d\n", size, data.length));
res.append("[");
for(int i = 0 ; i<size ; i++) {
res.append(data[i]);
if(i != size - 1)
res.append(", ");
}
res.append("]");
return res.toString();
}
public E get(int index) {
if(index < 0 || index >= size)
throw new IllegalArgumentException("Get failed. Index is illegal");
return data[index];
}
public E getFirst() {
return get(size - 1);
}
public E getLast() {
return get(0);
}
void set(int index, E e) {
if(index < 0 || index >= size)
throw new IllegalArgumentException("Get failed. Index is illegal");
data[index] = e;
}
public boolean contains(E e) {
for(int i = 0; i < size; i++) {
if(data[i].equals(e))
return true;
}
return false;
}
public int find(E e) {
for(int i = 0; i < size; i++) {
if(data[i].equals(e))
return i;
}
return -1;
}
public E remove(int index) {
if(index < 0 || index >= size)
throw new IllegalArgumentException("Get failed. Index is illegal");
E res = data[index];
for(int i = index; i<size; i++) {
data[i] = data[i+1];
}
size--;
//释放空间,也可以不写
//loitering objects != memory leak
data[size] = null;
if(size == data.length / 4 && data.length / 2 != 0)
resize(data.length / 2);
return res;
}
public E removeFirst() {
return remove(0);
}
public E removeLast() {
return remove(size-1);
}
//只删除了一个e,并不能保证删除了全部e
public void removeElement(E e) {
int index = find(e);
if(index != -1)
remove(index);
}
private void resize(int newCapacity) {
E[] newData = (E[]) new Object[newCapacity];
for(int i=0; i < size; i++) {
newData[i] = data[i];
}
data = newData;
}
}
队列接口:
public interface Queue<E> {
int getSize();
boolean isEmpty();
void enqueue(E e);
E dequeue();
E getFront();
}
数组队列:
package Date_pacage;
public class ArrayQueue<E> implements Queue<E> {
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);
}
}
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();
}
}
循环队列:
队列为空:front == tail
队列满:(tail+1)%data.length == front
package Date_pacage;
public class LoopQueue<E> implements Queue<E> {
private E[] data;
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 ++;
}
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 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];
}
@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 = 0 ; 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();
}
}
java——数组队列 ArrayQueue的更多相关文章
- JAVA该队列中的数组,圆阵队列,链队列
/** * 文件名:QueueText.java * 时间:2014年10月22下午9:05:13 * 笔者:维亚康姆维修 */ package chapter3; /** * 类名:ArrayQue ...
- 【栈和队列】5、队列概述与数组队列的基本实现 - Java
3-5 数组队列 简单记录 - bobo老师的玩转算法系列–玩转数据结构 - 栈和队列 队列Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另 ...
- Java中的自定义数组队列
在Java中,作为所有数据结构中存储和获取速度最快的一种,数组凭借其这种简单易用的优势在各个方面都能大显神威.但是数组也有自身的局限性.数组的长度必须是固定的一旦定义之后就无法动态的更改,这就会造成这 ...
- JAVA之数组队列
package xxj.datastructure0810; import java.util.Random; public class DataStructure { /** * @param ar ...
- java数组实现队列
数组队列 用数组实现的队列,也叫循环队列.就是定义一个数组,用两个下标head,tail表示队头和队尾.当队头和队尾相等时,队列为空.当队尾+1等于队头时,队列为满. 注意tail的值,当插入一个元素 ...
- Java Queue 队列
队列是一种先进先出的数据结构,队列中插入元素和删除元素分别位于队列的两端. 在Java中 队列实现类众多,本文不再赘述.本文探讨的是如何自定义队列实现类: 基于数组方式实现队列: 注意点: 当出队时队 ...
- 并发编程(八)—— Java 并发队列 BlockingQueue 实现之 ArrayBlockingQueue 源码分析
开篇先介绍下 BlockingQueue 这个接口的规则,后面再看其实现. 阻塞队列概要 阻塞队列与我们平常接触的普通队列(LinkedList或ArrayList等)的最大不同点,在于阻塞队列的阻塞 ...
- java常用队列分析
一.ArrayBlockingQueue 首先看一段源码: public class ArrayBlockingQueue<E> extends AbstractQueue<E> ...
- 细说并发5:Java 阻塞队列源码分析(下)
上一篇 细说并发4:Java 阻塞队列源码分析(上) 我们了解了 ArrayBlockingQueue, LinkedBlockingQueue 和 PriorityBlockingQueue,这篇文 ...
随机推荐
- WordCount测试小程序的实现
一.GitHub地址: https://github.com/245553473/WordCount 二.PSP表格: PSP PSP阶段 预估耗时(分钟) 实际耗时(分钟) Planning 计划 ...
- CodeForces 782B The Meeting Place Cannot Be Changed (二分)
题意:题意:给出n个人的在x轴的位置和最大速度,求n个人相遇的最短时间. 析:二分时间,然后求并集,注意精度,不然会超时. 代码如下: #pragma comment(linker, "/S ...
- 非阻塞socket与epoll
阻塞socket. –阻塞调用是指调用结果返回之前,当前线程会被挂起.函数只有在得到结果之后才会返回. –对于文件操作read,fread函数调用会将线程阻塞. –对于socket,accept与re ...
- appium自动化安装(一)
1.首先去 https://github.com/ 了解一下appium一些相关信息 2.安装node.js:node.js官方网站:https://nodejs.org/ 安装完成,打开Wind ...
- 输入框获取焦点后placeholder文字消失、修改placeholder的样式
输入框获取焦点后placeholder文字消失: <input placeholder='' onfocus="this.placeholder=''" onblur=&qu ...
- 论道HTML5 PDF扫描版
论道HTML5先简要介绍了如何用HTML5和CSS3制作网站,然后全面介绍了API和Canvas2D,接着介绍了如何在手机浏览器上开发HTML5相关的应用.WebSocketAPI相关的三个案例和时下 ...
- C#实现截图
语言环境 框架: .NET Framework 3.5IDE: VS2013窗体A(主窗体) /// <summary>/// 点击弹出截屏窗体/// </summary>// ...
- android studio中退出时弹出对话框
在app中总是不小心点击了退出怎么办?当然是加个弹出的提示框了,本人新手,就加在主界面上了 @Override public boolean onKeyDown(int keyCode, KeyEve ...
- 解决织梦手机网站M文件夹动态游览不生成html
今天的做手机网站的时候,发现dede织梦M文件夹下会生成index.html.对于手机网站来说,太麻烦了.每次更新手机网站首页都要把index.html删除掉重新生成. 然而织梦不支持手机网站首页动态 ...
- Mysql安装(Mac)
1.安装mysql(百度详解) 2.打开终端 3.输入vim ~/.bash_profile 4.在最后加上PATH=$PATH:/usr/local/mysql/bin 5.按esc,然后输入 :w ...