您的位置:首页 > 编程语言 > Java开发

队列的实现(JAVA)

2016-06-27 09:10 363 查看

定义

队列(queue)是一种特殊的线性表,它只允许在表的前端进行删除,在表的后端进行插入。

进行插入端的称为队尾,进行删除端的称为队头。队列是先进先出原则的。队列的实现同样可以

使用两种方式来实现,一种是数的实现方式,另一种是链表的实现方式。

队列的实现

我们已经知道队列已经有两种方式实现,虽然底层的实现方式不同,但是其具有的方法是相同

的,我们采用接口定义其具有的操作。

[java] view plain copy

package com.kiritor;

/**

* 队列FIFO的接口

* @author Kiritor

* */

public interface Queue<T> {

/**

* 入队:从队尾加入一个元素

* @param t

* */

void add(T t);

/**

* 出队:移走队头元素并返回

* @return 当前队头元素*/

T remove();

/**

* 当前队列的元素个数*/

int size();

/**

* 判断当前队列是否为空

* @return */

boolean isEmpty();

/**

* 只是返回队头元素,并未删掉

* @return t*/

T front();

}

队列的数组实现

[java] view plain copy

package com.kiritor;

import java.util.Arrays;

/**

* 基于数组实现的队列

* @author Kiritor*/

public class ArrayQueue<T> implements Queue<T>{

private T[] data;

private int size;//元素个数

private int front;//队列中第一个对象的位置

private int rear;//队列中当前对象的位置

public ArrayQueue() {

data = (T[]) new Object[10];

size = 0;

front =0;

rear = 0;

}

@Override

public void add(T t) {

if(isFull())

{

resize();

front = 0;

}

rear = (front+size)%data.length;

System.out.println(rear);

data[rear] = t;

size++;

}

@Override

public T remove() {

if (isEmpty()) {

throw new RuntimeException("队列为空!");

}

T tempData = data[front];

data[front] = null;

//思考一下这里有必要进行除法运算吗?

front = (front + 1) % (data.length);

size--;

return tempData;

}

@Override

public int size() {

return size;

}

@Override

public boolean isEmpty() {

return size == 0;

}

@Override

public T front() {

if (isEmpty()) {

throw new RuntimeException("队列为空!");

}

return data[front];

}

/**

* 判断当前队列是否已满

* @return*/

public boolean isFull()

{

return size == data.length;

}

/**

* 扩容,2倍

* */

public void resize()

{

/*注意重新扩容的时候并不需要去设置size

* 队列的大小并不能通过数组的大小直观的显示出来。

* 但是栈就可以直观的通过数组的大小显示出来*/

T[] tmp = (T[]) new Object[data.length*2];

System.arraycopy(data, 0, tmp, 0, data.length);

data = tmp;

tmp = null;//引用置为空,便于gc处理

}

public static void main(String[] args) {

ArrayQueue<String> q = new ArrayQueue<String>();

q.add("a");

q.add("b");

q.add("c");

q.add("d");

q.add("e");

q.add("f");

q.add("g");

q.add("h");

q.add("i");

q.add("j");

q.add("k");

q.add("l");

q.add("m");

while( !q.isEmpty() ){

String temp = q.remove();

System.out.println(temp);

}

}

}

队列的链表实现

[java] view plain copy

package com.kiritor;

/**

* 队列的链表实现

* @author Kiritor

* @param <T>*/

public class LinkQueue<T> implements Queue<T> {

private Node head;

private Node rear;

private int size;

public LinkQueue() {

head = null;

rear = null;

size = 0;

}

class Node

{

T data;

Node next;

public Node() {

//无参构造

}

public Node(T t)

{

this.data = t;

}

}

/**

* 从队列的尾部插入结点*/

@Override

public void add(T t) {

Node node = new Node(t);

/*如果是队列则头部和尾部都执行Node*/

if(isEmpty())

head = node;

else

rear.next = node;

rear = node;

size++;//队列长度+1

}

/**

* 从队列的头部删除

* @return T*/

@Override

public T remove() {

T tmp;

if(isEmpty()){

new NullPointerException("队列是空的!");

tmp = null;

}

else

{

if(null==head.next )

rear = null;

tmp = head.data;

head = head.next;

size--;

}

return tmp;

}

@Override

public int size() {

return size;

}

@Override

public boolean isEmpty() {

return head == null;

}

/**

* 查看队列头部,不做任何处理*/

@Override

public T front() {

if(head !=null)

return head.data;

return null;

}

public static void main(String[] args) {

LinkQueue<String> q = new LinkQueue<String>();

q.add("a");

q.add("b");

q.add("c");

q.add("d");

q.add("e");

q.add("f");

q.add("g");

q.add("h");

q.add("i");

q.add("j");

q.add("k");

q.add("l");

q.add("m");

System.out.println(q.size);

while( !q.isEmpty() ){

String temp = q.remove();

System.out.println(temp);

System.out.println(q.size());

}

}

}

看下链队列的演示操作吧

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: