队列是操作受限的线性结构
只能从一端添加数据另一端删除数据
特点:先进先出
自定义一个队列
底层:动态数组
public interface Queue<E> {
void enqueue(E e);
E dequeue();
E getFront();
int getSize();
boolean isEmpty();
}
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 stringBuilder = new StringBuilder();
stringBuilder.append("Queue:");
stringBuilder.append("front[");
for (int i = 0; i < array.getSize(); i++) {
stringBuilder.append(array.get(i));
if (i != array.getSize() - 1) {
stringBuilder.append(", ");
}
}
stringBuilder.append("]tail");
return stringBuilder.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);
}
}
}
}
array
//泛型数组
public class Array<E>{
private E[] data;
private int size;//记录元素个数
//构造函数,用户创建数组开辟的空间
public Array(int capacity) {
// new 一个E类型的数组
data =(E[]) new Object[capacity];
size = 0;
}
//用户不传参时,默认开辟空间10
public Array() {
this(10);
}
//获取数组中元素个数
public int getSize() {
return size;
}
//获取空间大小
public int getCapacity() {
return data.length;
}
//判断数组是否为空
public boolean isEmpty() {
return size == 0;
}
//在数组最后添加元素2-3
public void addLast(E e) {
// if (size == data.length)
// throw new IllegalArgumentException("Addlast failed.Array is full");
// data[size] = e;
// size++;
add(size,e);
}
//在首位置添加元素
public void addFirst(E e){
add(0,e);
}
//指定位置添加元素
//元素从后往前挪把指定位置空出来
public void add(int index,E e){
if (index<0||index>size)
throw new IllegalArgumentException("Add failed.Require index>=0 and index<=size");
if (size == data.length)
//动态扩容
resize(2*data.length);
for (int i=size-1;i>=index;i--){
data[i+1]=data[i];
}
data[index]=e;
size++;
}
/**
* 改变数组容量
* 新建一个数组,将data的值传入
* @param newCapacity
*/
private void resize(int newCapacity) {
E []newData = (E[]) new Object[newCapacity];
for (int i = 0; i < size; i++) {
newData[i]=data[i];
}
data=newData;
}
//获取index索引的位置
public E get(int index){
if (index<0||index>=size)
throw new IllegalArgumentException("Add failed.Require index>=0 and index<=size");
return data[index];
}
//更新数组元素
public void set(int index,E e){
if (index<0||index>=size)
throw new IllegalArgumentException("Add failed.Require index>=0 and index<=size");
data[index]=e;
}
//是否包含某元素
public boolean contains(E e){
for (int i = 0; i < size; i++) {
if (e.equals(data[i]))
return true;
}
return false;
}
//返回所要查找的元素的索引
public int find(E e){
for (int i = 0; i < size; i++) {
if (e.equals(data[i]))
return i;
}
return -1;
}
//删除索引处的某个元素并返回,将索引之后的元素向前移动
public E remove(int index){
if (index<0||index>size)
throw new IllegalArgumentException("Add failed.Require index>=0 and index<=size");
E result=data[index];
for (int i = index+1; i < size; i++) {
data[i-1]=data[i];
}
size--;
// data[size]=null;
//只有一半的空间被利用时,缩减容量的一半
if (size==data.length/2){
resize(data.length/2);
}
return result;
}
//删除头元素
public E removeFirst(){
return remove(0);
}
//删除最后一个元素
public E removeLast(){
return remove(size-1);
}
//删除某个元素
public void removeElement(E e){
int index = find(e);
if (index!=-1)
remove(index);
}
public E getFirst(){
return get(0);
}
public E getLast(){
return get(size-1);
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(String.format("Array:size=%d,capacity =%d\n",size,data.length));
stringBuilder.append("[");
for (int i=0;i<size;i++){
stringBuilder.append(data[i]);
if (i!=size-1)
stringBuilder.append(",");
}
stringBuilder.append("]");
return stringBuilder.toString();
}
}