Java实现队列和循环队列
队列接口(Interface)
public interface MyQueueInterface<E> {
public void enqueue(E element);
public E dequeue();
public E getFront();
public int getSize();
public boolean isEmpty();
}
队列实现类,容器使用自定义动态数组link
public class MyQueue<E> implements MyQueueInterface<E> {
MyArray<E> array;
public MyQueue(){
this(10);
}
public MyQueue(int capacity){
array = new MyArray<>(capacity);
}
@Override
public void enqueue(E element) {
array.addLast(element);
}
@Override
public E dequeue() {
return array.deleteFirstElement();
}
@Override
public E getFront() {
return array.getElementByIndex(0);
}
@Override
public int getSize() {
return array.size;
}
@Override
public boolean isEmpty() {
return array.isEmpty();
}
@Override
public String toString() {
StringBuffer str = new StringBuffer();
str.append(String.format("队列容量为:%d,队列内的元素个数有:%d",array.getCapacity(),getSize()));
str.append("[");
for (int i = 0; i < getSize(); i++) {
if (i != getSize()-1){
str.append(array.getElementByIndex(i)+",");
}else{
str.append(array.getElementByIndex(i));
}
}
str.append("]");
return str.toString();
}
}
队列实现类:循环队列,容器使用数组
public class MyLoopQueue<E> implements MyQueueInterface<E> {
private E[] data;
private int size;
private int front;
private int tail;
public MyLoopQueue(){
this(10);
}
public MyLoopQueue(int capacity){
data = (E[])new Object[capacity];
size = 0;
front = 0;
tail = 0;
}
@Override
public void enqueue(E element) {
try {
if ((tail + 1) % data.length == front) {
reSize(data.length << 1);
} else {
data[tail] = element;
tail = (tail + 1) % data.length;
size++;
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void reSize(int newCapacity){
E[] newData = (E[])new Object[newCapacity];
for (int i = 0; i < getSize(); i++) {
newData[i] = data[(front+i) % data.length];
}
front = 0;
tail = getSize();
data = newData;
}
@Override
public E dequeue() {
E result = null;
result = data[front];
data[front] = null;
front = (front + 1) % data.length;
size--;
if (size == data.length/2 && (data.length >> 1) >= 10){
reSize(data.length >> 1);
}
return result;
}
@Override
public E getFront() {
return data[front];
}
@Override
public int getSize() {
return size;
}
@Override
public boolean isEmpty() {
return front == tail;
}
@Override
public String toString() {
StringBuffer str = new StringBuffer();
str.append(String.format("循环队列的容量为:%d,有效元素数量为:%d",data.length,getSize()));
str.append("[队首:");
for (int i = 0; i < data.length; i++) {
if (i != data.length-1){
str.append(data[(front + i) % data.length] + ",");
}else{
str.append(data[(front + i) % data.length]);
}
}
str.append("]");
return str.toString();
}
}