1、介绍
同栈一样,队列也是一种线性存储结构,先入先出(FIFO),队列只能在队尾执行添加操作,在队头进行删除操作。
2、数组实现(可以存任何类型)
①、接口
interface Queue<T>{
public void push(T data);
public T pop();
public T peek();
public boolean isFull();
public boolean isNull();
public int size();
public void printQueue();
}
②、数组实现类:
class ArrayQueue<T> implements Queue<T>{
final static int DEFAULT_LENGTH = 5;
private int length = 5;
private T[] array;
private int rear = -1;//指向队尾
private int size = 0;
public ArrayQueue(Class<T> classType,int length){
array = (T[]) Array.newInstance(classType, length);
this.length = length;
rear = -1;
}
public ArrayQueue(Class<T> classType){
this(classType,DEFAULT_LENGTH);
}
@Override
public void push(T data) {
// TODO Auto-generated method stub
if(isFull())
throw new RuntimeException("队列已满");
array[++rear] = data;
size++;
}
@Override
public T pop() {
// TODO Auto-generated method stub
if(isNull())
throw new RuntimeException("队列已空");
T data = array[0];
for (int i = 0; i < size-1; i++) {
array[i] = array[i+1];
}
size--;
return data;
}
@Override
public T peek() {
// TODO Auto-generated method stub
if(isNull())
throw new RuntimeException("队列已空");
return array[0];
}
@Override
public boolean isFull() {
// TODO Auto-generated method stub
return size == length;
}
@Override
public boolean isNull() {
// TODO Auto-generated method stub
return size == 0;
}
@Override
public int size() {
// TODO Auto-generated method stub
return size;
}
@Override
public void printQueue() {
// TODO Auto-generated method stub
for (int i = 0; i < size; i++) {
System.out.print(array[i]);
}
System.out.println();
}
}
③、操作实例:
ArrayQueue<Integer> arrayQueue = new ArrayQueue<>(Integer.class);
arrayQueue.push(1);
arrayQueue.push(2);
arrayQueue.push(3);
arrayQueue.push(4);
arrayQueue.push(5);
arrayQueue.pop();
arrayQueue.printQueue();
System.out.println(arrayQueue.size());
3、链表实现(可以存任何类型)
①、链表实现类
class LinkQueue<T> implements Queue<T>{
private int size = 0;
private Node<T> first;
private Node<T> last;
private static class Node<T>{
T item;
Node<T> next;
Node(T item,Node<T> nextNode){
this.item = item;
this.next = nextNode;
}
}
public void addLast(T item) {
// TODO Auto-generated method stub
Node<T> newNode = new Node<T>(item, null);
if(last == null){
first = newNode;
last = newNode;
}else {
last.next = newNode;
last = newNode;
}
size++;
}
public T getFisrt() {
// TODO Auto-generated method stub
if(first == null)
throw new NoSuchElementException();
return first.item;
}
public T removeFirst() {
// TODO Auto-generated method stub
T item = null;
if(first == null)
throw new IndexOutOfBoundsException("index超出限度");
item = first.item;
first = first.next;
if(first == null)
last = null;
size--;
return item;
}
@Override
public void push(T data) {
// TODO Auto-generated method stub
addLast(data);
}
@Override
public T pop() {
// TODO Auto-generated method stub
return removeFirst();
}
@Override
public T peek() {
// TODO Auto-generated method stub
return getFisrt();
}
@Override
public boolean isFull() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isNull() {
// TODO Auto-generated method stub
return size == 0;
}
@Override
public int size() {
// TODO Auto-generated method stub
return size;
}
@Override
public void printQueue() {
// TODO Auto-generated method stub
Node<T> node = first;
for (int i = 0; i < size; i++) {
System.out.print(node.item);
node = node.next;
}
System.out.println();
}
}
②、操作实例
LinkQueue<Integer> linkQueue = new LinkQueue<>();
linkQueue.push(1);
linkQueue.push(2);
linkQueue.push(3);
linkQueue.push(4);
linkQueue.push(5);
linkQueue.pop();
linkQueue.printQueue();
System.out.println(linkQueue.peek()+" "+linkQueue.size());