zoukankan      html  css  js  c++  java
  • 队列的实现

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

      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);
            
        }
    
    }
  • 相关阅读:
    3524: [Poi2014]Couriers -- 主席树
    bzoj 2190: [SDOI2008]仪仗队 -- 欧拉函数
    模板 -- 树链剖分
    bzoj 1823: [JSOI2010]满汉全席 -- 2-sat
    bzoj 1704: [Usaco2007 Mar]Face The Right Way 自动转身机 -- 贪心
    bzoj 1231: [Usaco2008 Nov]mixup2 混乱的奶牛 -- 状压DP
    redis 主从复制
    redis 事务
    redis持久化——AOF
    redis 持久化 ——RDB
  • 原文地址:https://www.cnblogs.com/yaobolove/p/6434331.html
Copyright © 2011-2022 走看看