基于数组的队列实现

时间:2014-03-04 04:17:30

标签: java

我正在关注一个在线示例,并使用数组"学习" Java中的循环Deque实现。以下是我关注的在线资源:

Circular Queue Implementation

我有一个基于数组的deque类,其最终容量为5.现在如果数组已满,那么我可以让方法创建所有对象的临时数组,然后将临时数组的所有对象复制回&# 34;对象[] arr"。我已经有一段时间了,但是还没能搞定。如果有人能帮我理解这个过程,我将不胜感激。我有以下类方法:

  1. insertAtFront()
  2. insertAtLast()
  3. 尺寸()
  4. 的isEmpty()
  5. 的toString()
  6. 这是我的代码:

    public class ArrayDeque {
    
        private static final int INIT_CAPACITY = 5;             
        private int front;                              
        private int rear;                                       
        private Object[] arr;                           
    
    
        public ArrayDeque(){
    
            arr = new Object[ INIT_CAPACITY ];
            front = 0;
            rear = 0;       
        }   
    
    
        public void insertAtFirst(Object item){
    
            if(size() >= arr.length){
    
                Object[] tmp = new Object[arr.length + INIT_CAPACITY];
    
                for(int i = 0; i < size(); ++i)
                    tmp[i] = arr[i];
    
                arr = tmp;
            }
            arr[front] = item;
            ++front;
        }
    
    
        public void insertAtLast(Object item){
    
            if(size() >= arr.length){
    
                Object[] tmp = new Object[arr.length + INIT_CAPACITY];
    
                for(int i = 0; i < size(); ++i)
                    tmp[i] = arr[i];
    
                arr = tmp;
            }
            arr[rear] = item;
            ++rear;
        }
    
    
        public int size(){
    
            return (rear - front);      
        }   
    
    
        public boolean isEmpty(){
    
            return (front == rear);
    
        }   
    
    
        public String toString(){
    
            String s = "";
            for(int i = 0; i < size(); ++i)
                s += arr[i] + "\n";
            return s;
        }   
    }//CLASS    
    

1 个答案:

答案 0 :(得分:2)

尝试下面的代码,我通过跟踪阵列填充的数量来改变逻辑。你的主要问题是size()函数,它给出了错误的指示。一些优化正在等待,我在结果中看到一些空值。

public class ArrayDeque {
    public static void main(String[] args) {
        ArrayDeque t = new ArrayDeque ();
        t.insertAtFirst("1");
        t.insertAtFirst("2");
        t.insertAtFirst("3");
        t.insertAtFirst("4");
        t.insertAtFirst("5");
        t.insertAtFirst("6");
        t.insertAtFirst("7");
        t.insertAtFirst("8");
        t.insertAtFirst("9");
        t.insertAtFirst("10");
        t.insertAtFirst("11");
        t.insertAtFirst("12");
        t.insertAtFirst("13");
        t.insertAtFirst("14");

        System.out.println("After first--"+t.toString());
        t.insertAtLast("1");
        t.insertAtLast("2");
        t.insertAtLast("3");
        t.insertAtLast("4");
        t.insertAtLast("5");
        t.insertAtLast("6");
        t.insertAtLast("7");
        t.insertAtLast("8");
        t.insertAtLast("9");
        t.insertAtLast("10");
        t.insertAtLast("11");
        t.insertAtLast("12");
        t.insertAtLast("13");
        t.insertAtLast("14");
        System.out.println("After last--"+t.toString());
    }
    private static final int INIT_CAPACITY = 5;             

    private int NEW_CAPACITY;
    private int ARRAY_SIZE;
    private Object[] arr;                           


    public TestClass(){

        arr = new Object[ INIT_CAPACITY ];

        NEW_CAPACITY = INIT_CAPACITY;
        ARRAY_SIZE = 0;
    }   


    public void insertAtFirst(Object item){

        if(ARRAY_SIZE == 0)
        {
            arr[0] = item;
            ARRAY_SIZE++;
        }
        else if(ARRAY_SIZE+1 < arr.length)
        {
            Object[] tmp = new Object[NEW_CAPACITY];
             for(int i = 1; i < arr.length; ++i)
                tmp[i] = (String)arr[i-1];

            arr = tmp;
            arr[0] = item;
            ARRAY_SIZE++;
        }
        else if(ARRAY_SIZE+1 >= arr.length)
        {
            NEW_CAPACITY = NEW_CAPACITY+INIT_CAPACITY;
            Object[] tmp = new Object[NEW_CAPACITY];
             for(int i = 1; i < arr.length; ++i)
                tmp[i] = (String)arr[i-1];

            arr = tmp;
            arr[0] = item;
            ARRAY_SIZE++;
        }
    }


    public void insertAtLast(Object item){

        if(ARRAY_SIZE == 0)
        {
            arr[0] = item;
            ARRAY_SIZE++;
        }
        else if(ARRAY_SIZE+1 < arr.length)
        {

            arr[ARRAY_SIZE] = item;
            ARRAY_SIZE++;
        }
        else if(ARRAY_SIZE+1 >= arr.length)
        {
            NEW_CAPACITY = NEW_CAPACITY+INIT_CAPACITY;
            Object[] tmp = new Object[NEW_CAPACITY];
             for(int i = 0; i < arr.length; ++i)
                tmp[i] = (String)arr[i];

            arr = tmp;

            arr[ARRAY_SIZE] = item;
            ARRAY_SIZE++;
        }
    }


    public int size(){

        return ARRAY_SIZE;      
    }   


    public boolean isEmpty(){

        return (ARRAY_SIZE == 0);

    }   


    public String toString(){

        String s = "";
        for(int i = 0; i < arr.length; ++i)
            s += arr[i] + "\t";
        return s;
    }   
}