public interface Deque<E> {
/**
* 队列加入元素
*
* @param e
*/
void push(E e);
/**
* 队列取元素
*/
E pop();
default boolean isFull() {
return false;
}
default boolean isEmpty() {
return false;
}
void showDequeData();
}
package com.huo.deque;
import java.util.ArrayList;
import java.util.Arrays;
public class ArrayDeque<E> implements Deque<E> {
/**
* 数组
*/
transient Object[] elementData;
/**
* 大小
*/
private int size;
/**
* 容量
*/
private int capcity;
public ArrayDeque(int capcity) {
this.capcity = capcity;
elementData = new Object[capcity];
}
@Override
public void push(E e) {
if (e == null) {
throw new NullPointerException();
}
if (isFull()) {
throw new RuntimeException("队列满!无法加入数据");
}
elementData[size++] = e;
}
@Override
public E pop() {
if (isEmpty()) {
throw new ArrayIndexOutOfBoundsException("队列为空,无法取数据");
}
E e = (E) elementData[0];
//不是空的话,建立新数组,把旧数组的内容复制到新数组
if (!isEmpty()) {
Object[] newEelementData = new Object[capcity];
//下标为0的pop了,从第一个开始复制
for (int i = 1; i < size; i++) {
if (elementData[i] != null) {
newEelementData[i - 1] = elementData[i];
}
}
elementData = newEelementData;
}
size--;
return e;
}
@Override
public boolean isFull() {
return size == capcity;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public void showDequeData() {
System.out.println(Arrays.toString(elementData));
}
}
测试
public static void main(String[] args) {
ArrayDeque<String> s = new ArrayDeque<>(10);
s.push("我");
s.push("是");
s.push("你");
s.push("同");
s.push("学");
s.showDequeData();
s.pop();
s.showDequeData();
s.pop();
s.showDequeData();
s.pop();
s.showDequeData();
s.pop();
s.showDequeData();
}
//结果
[我, 是, 你, 同, 学, null, null, null, null, null]
[是, 你, 同, 学, null, null, null, null, null, null]
[你, 同, 学, null, null, null, null, null, null, null]
[同, 学, null, null, null, null, null, null, null, null]
[学, null, null, null, null, null, null, null, null, null]