方案一:数组实现
实现方法:
用front来记录队列首元素的位置,用rear来记录队列尾元素的位置。入队列的时候只需要将待入队列的元素放到下标为rear的位置即可,同时执行rear++。出队列的时候front++即可
优点:实现简单。
缺点:出队列后数组的前半部分空间不能充分的利用。
实现代码如下:
package com.ibianma.zifuchuan;
import java.util.ArrayList;
public class Queue<T> {
ArrayList<T> arr = new ArrayList<T>();
private int front;
private int rear;
public Queue(){
front = 0;
rear = 0;
}
public Boolean isEmpty(){
return front==rear;
}
public int size(){
return rear-front;
}
public T getFront(){
if (isEmpty()){
return null;
}
return arr.get(front);
}
public T getBavk(){
if (isEmpty()){
return null;
}
return arr.get(rear-1);
}
public void deQueue(){
if (rear>front){
front++;
}
else {
System.out.println("队列已经为空");
}
}
public void enQueue(T item){
arr.add(item);
rear++;
}
}
方案二:链表实现
实现方法:
分别用两个指针记录队首与队尾元素。只需要对节点进行操作就好了,具体操作参考下面给出的代码。
优点:比数组灵活。
缺点:多了用来储存节点的指针
实现代码如下:
package com.ibianma.zifuchuan;
class LNode<T>{
T data;
LNode<T> next;
}
public class MyQueue<T> {
private LNode<T> pHead;
private LNode<T> pEnd;
public MyQueue(){
pEnd=null;
pHead=null;
}
public Boolean isEmpty(){
return pHead==null;
}
public int size(){
int size = 0;
LNode<T> p = pHead;
while (p!=null){
p=p.next;
size++;
}
return size;
}
public void enQueue(T e){
LNode<T> p = new LNode<>();
p.data = e;
p.next= null;
if (pEnd==null){
pEnd=pHead=p;
}else {
pEnd.next = p;
pEnd = p;
}
}
public void deQueue(){
if (pHead==null){
System.out.println("队列为空!");
}else {
pHead = pHead.next;
}
}
public T getFront(){
if (!isEmpty()){
return pHead.data;
}else {
System.out.println("队列为空!");
return null;
}
}
public T getEnd(){
if(!isEmpty()){
return pEnd.data;
}else{
System.out.println("队列为空!");
return null;
}
}
}