队列的实现

Posted ServerSocket

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了队列的实现相关的知识,希望对你有一定的参考价值。

首先来了解下队列的特点:

  First in First out: 先进先出

  在对列中有两种存储方式

  其一是按顺序存储,也就是用数组进行存储

  其二是按链式存储,也就是按链表来进行存储

 

其一:

public class CirQueue<E> {
    //对象数组,队列最多存储a.length-1个对象
    E[] a;
    //默认初始化大小
    private static final int DEFAULT_SIZE=10;
    //对首下标
    int front;
    //队尾下标
    int rear;
    
    public CirQueue(){
        this(DEFAULT_SIZE);
    }
    /**
     * 初始化指定长度的队列
     * @param size
     */
    @SuppressWarnings("unchecked")
    public CirQueue(int size){
        a=(E[])(new Object[size]);
        front=0;
        rear=0;
    }
    
    /**
     * 将一个对象追加到队列尾部
     * @param obj
     * @return 队列满时返回false,否则返回true
     * @author yaobo
     */
    public boolean enqueue(E obj){
        if((rear+1)%a.length==front){
            return false;
        }else{
            a[rear]=obj;
            rear=(rear+1)%a.length;
            return true;
        }
    }
    
    /**
     * 队列头部出队
     * @return
     * @author yaobo
     */
    public E dequeue(){
        if(rear==front)
            return null;
        else{
            E obj =a[front];
            front=(front+1)%a.length;
            return obj;
        }
    }
    
     
    //队列长度
    public int length(){
        if(rear>front){
            return rear-front;
        }else
            return a.length-1;
    }
    
    /**
     * 判断是否为空 
     * @return
     * @author yaobo
     */
    public boolean isEmpty(){
        return rear==front;
    }
    
    public String toString(){
        StringBuffer sb=new StringBuffer();
        sb.append("[");
        for(int i=front;i<rear;i++){
            if(a[i]!=null){
                sb.append(a[i]+",");
            }
        }
        sb.delete(sb.length()-1, sb.length());
        sb.append("]");
        return sb.toString();
    }
    


    public static void main(String[] args) {
        CirQueue<String> queue=new CirQueue<String>(7);
        queue.enqueue("1");
        queue.enqueue("2");
        queue.enqueue("3");
        queue.enqueue("4");
        queue.enqueue("5");
        System.out.println(queue);
        System.out.println("size="+queue.length());
        int size=queue.length();
        System.out.println("*******出栈操作*******");
        for(int i=0; i<size;i++){
            System.out.println("size="+queue.length());
            System.out.println(queue.dequeue()+" ");
            System.out.println(queue);
        }        
    }
    
}

其二:

/*
 * 链式存储队列
 */
public class LinkQueue<T> {  
    
    //创建一个链表结构
    private class Node{
        public T data ;
        public Node next;
        
        //创建无参构造方法
        public Node(){
            
        }
        
        Node(T data,Node next){
            this.data=data;
            this.next=next;
        }
    }
    
    private Node front;
    private Node rear;
    private int size;
    
    //构造方法,创建队列
    public LinkQueue(){
        front=new Node(null,null);
        rear=new Node(null,null);
        front=rear;
        size=0;
    }
    
    //入队列操作
    public void Enqueue(T data){
        Node d=new Node(data,null);
        rear.next=d;
        rear=d;
        size++;
    }
    
    //出队列操作
    public T DeQueue(){
        if(rear==front){
            return null;
        }
        Node p=new Node(null,null);
        p=front.next;
        T data=p.data;
        if(p.next==null){
            rear=front;
        }
        front.next=p.next;
        p=null;
        size--;
        return data;
        
    }
    
    //判断长度
    public int Size(){
        return size;
    }
    
    //判断是否为空
    public boolean isEmpty(){
        if(rear==front){
            return true;
        }
        return false;
    }
    
    public String toString() {  
        if(isEmpty()){  
            return "[]";  
        }else{  
            StringBuilder sb = new StringBuilder("[");  
            for(Node current=front.next;current!=null;current=current.next){  
                sb.append(current.data.toString() + ", ");  
            }  
            int len = sb.length();  
            return sb.delete(len - 2, len).append("]").toString();  
        }  
    } 
    
    
    public static void main(String arg[]){
        LinkQueue queue=new LinkQueue();
        queue.Enqueue(1);
        queue.Enqueue(2);
        queue.Enqueue(3);
        queue.Enqueue(4);
        System.out.println(queue);
        System.out.println("队列长度:"+queue.Size());
        System.out.println("出队:"+queue.DeQueue());
        System.out.println("队列长度="+queue.Size());
        System.out.println(queue);
        System.out.println("出队:"+queue.DeQueue());
        System.out.println("队列长度="+queue.Size());
        System.out.println(queue);
        System.out.println("出队:"+queue.DeQueue());
        System.out.println("队列长度="+queue.Size());
        System.out.println(queue);
        
    }

}

 

以上是关于队列的实现的主要内容,如果未能解决你的问题,请参考以下文章

perl中的队列

完全下载文件时,将下载的文件从一个片段传递到另一个片段

代码片段 - Golang 实现简单的 Web 服务器

ASP.net MVC 代码片段问题中的 Jqgrid 实现

代码片段 - Golang 实现集合操作

如何实现具有不同片段/布局的 ViewPager