队列的实现(JAVA)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kiritor/article/details/8868078

       定义

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

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

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

       队列的实现

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

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

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();  
}

           队列的数组实现

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);  
        }  
	}
}

              队列的链表实现

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());
        }  
	}
}
                  看下链队列的演示操作吧

                         


展开阅读全文

没有更多推荐了,返回首页