接上篇,实现一下队列:
循环队列实现代码:
API定义如下
package lee.tools;
public interface Queue<T>{
boolean isEmpty(); //是否为空
void enQuene(T data); //入队
T deQueue(); //出队
}
循环队列实现代码:
package lee.tools;
public class CircleQueue<T> implements Queue<T>{
T arr[];
int size;
public int front;
public int rear;
@SuppressWarnings("unchecked")
public CircleQueue(){
size=5;
arr = (T[]) new Object[size];
}
@Override
public boolean isEmpty() {
if(front==rear){
return true;
}
else{
return false;
}
}
public boolean isFull(){
if(front==(rear+1)%size){
return true;
}
else{
return false;
}
}
// 如果队列空间不够用,扩大一倍
public void enLargeQueue(){
@SuppressWarnings("unchecked")
T[] newArry = (T[]) new Object[size*2];
for(int i=0;i<size;i++){
newArry[i] = arr[i];
}
this.size = size*2;
arr = newArry;
}
@Override
public void enQuene(T data) {
if(isFull()){
enLargeQueue();
}
arr[rear]=data;
rear = (rear+1)%size;
}
@Override
public T deQueue() {
if( isEmpty() ){
System.out.println("the Queue is empty");
return null;
}
T key=arr[front];
front=(front+1)%size;
return key;
}
}
链接队列实现如下:
package lee.tools;
public class LinkedQueue<T> implements Queue<T>{
Node<T> head;
Node<T> tail;
int size;
public boolean isEmpty(){
if(head==null){
return true;
}
else{
return false;
}
}
public void enQuene(T data){
if(head==null){
head = new Node<T>(data);
tail=head;
}
else{
tail.next=new Node<T>(data);
tail = tail.next;
}
}
public T deQueue(){
if(!isEmpty()){
T temp =head.data;
head = head.next;
return temp;
}
else return null;
}
class Node<T>{
T data;
Node<T> next;
Node(T d){
data = d;
}
}
}