队列数组实现调整大小

时间:2013-11-22 05:14:13

标签: java arrays methods queue

我被要求使用基本方法创建一个简单的队列数组实现,如enqueue,dequeue,isEmpty和类似的东西。我唯一的问题是我在调整大小方法时遇到困难,因为如果我想在我的队列中添加更多值(固定大小因为是一个数组)我不知道如何让它工作并保持所有的值地点。 一切都有效,万一你想知道,唯一不行的是我的调整大小(这里写的方法并不是我尝试过的唯一方法)。 如果你想尝试一下,我也会把我的主要方法放进去,希望你能提供帮助,谢谢。

主要方法:

  public class MainQueue {
              public static void main(String[] args) {

            int capacity=10;
            Queue<Integer> queue = new Queue<Integer>(capacity);

            queue.enqueue(1);
            queue.enqueue(2);
            queue.enqueue(3);
            queue.enqueue(4);
            queue.enqueue(5);
            queue.enqueue(6);
            queue.enqueue(7);
            queue.enqueue(8);
            queue.enqueue(9);
            queue.enqueue(10);

            System.out.println("Queue: "+ queue);

                            //WORKS SO FAR
                            queue.enqueue(11);
                            //11 is placed at the beginning of the queue  
                            //instead at the end and my last value is null (?)                              

班级队列:

 import java.util.NoSuchElementException;


 public class Queue <E>{
 private E[] elements;//array in generic
 private int front;//first element or front of the queue
 private int back;//last element or back of the queue
 private int capacity; //capacity of the queue
 private int count; //indicates number of elements currently stored in the queue

        @SuppressWarnings("unchecked")
        public Queue(int size)
        {
            capacity = size;
            count = 0;
            back = size-1;
            front = 0;
            elements =(E []) new Object[size];  //array empty   
        }

    //Returns true if the queue is empty or false
    public boolean isEmpty()
        {
            return count==0;//means its true
        }

    //Add elements to the queue 
    public void enqueue(E item)
        {  
            if(count == capacity) 
            {  
                 resize(capacity*2);
                  // System.out.println("Queue is full");  

             }

            back =(back+1) % capacity;    //example back=(0+1)%10=1
            elements[back]=item;
            //elements[0]=0
            //item=elements[count];
            count++;
            }


    //Public resize
    public void resize(int reSize){
        E[] tmp = (E[]) new Object[reSize];

           int current = front;
           for (int i = 0; i < count; i++)
              {
              tmp[i] = elements[current];
              current = (current + 1) % count;
              }
         elements = tmp;

           }


    //Dequeue method to remove head
    public E dequeue() 
            {
                if(isEmpty())
                    throw new NoSuchElementException("Dequeue: Queue is empty");
                else
                {
                    count--;
                    for(int x = 1; x <= count; x++)
                    {
                        elements[x-1] = elements[x];
                    }
                    capacity--;
                    return (E) elements;
                }
            }

//peek the first element
    public E peek()   
        {
            if(isEmpty())  
               {  
                   throw new NoSuchElementException("Peek: Queue is empty");
               }

               else  
                   return elements[front];
         }


//Print queue as string
     public String toString()    
           {  

           if(isEmpty()) {
               System.out.println("Queue is empty.");
            //throw new NoSuchElementException("Queue is empty");
           }

               String s = "[";  
               for(int i = 0; i <count; i++)  
               {  
                   if(i != 0)  
                       s += ", ";  
                   s = s + elements[i];// [value1,value2,....]  
               }  

               s +="]";  
              return s;  
           }  

       public void delete() {   //Delete everything
           count = 0;
       }
       }

2 个答案:

答案 0 :(得分:1)

在扩展扩展队列的项目时,您在重新调整大小时没有错误。

    调整大小算法中的
  1. current =(当前+ 1)%count;应该是(当前+ 1)%容量

  2. 您必须在调整大小功能中更改容量值 capacity = resize;

  3. 为什么在出队时改变容量?

答案 1 :(得分:1)

你在调整大小时忘了更新内容: 前方,容量和背部。

public void resize(int reSize){
    E[] tmp = (E[]) new Object[reSize];

       int current = front;
       for (int i = 0; i < count; i++)
          {
          tmp[i] = elements[current];
          current = (current + 1) % count;
          }
     elements = tmp;
     front = 0;
     back = count-1;
     capacity=reSize;
       }