2013-11-22 39 views
1

我被要求用基本方法創建一個簡單的隊列數組實現,比如enqueue,dequeue,isEmpty和類似的東西。我唯一的問題是,當涉及到resize方法時,Im陷入了困境,因爲如果我想向隊列中添加更多值(因爲是數組),我不知道如何使其工作並保留所有值地點。 一切正常,以防萬一你想知道,唯一不行的是我的調整大小(在這裏寫的方法不是我嘗試的唯一一個)。 如果你想嘗試一下,我會把我的主要方法,希望你能幫助,謝謝。

主要方法:隊列數組實現調整大小

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; 
     } 
     } 
+0

Ups,對不起,我寫了queue.enque(11);而不是queue.enqueue(11); –

+0

你的reSize'應該做什麼? – Christian

回答

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; 
     } 
+0

記得添加amalds bugfix並在mod操作上使用容量:) –

1

你必須在其中入隊隊列拓展項目時調整一些失誤。

  1. 調整大小算法 current =(current + 1)%count;應該是(當前+ 1)%容量

  2. 您必須更改調整大小功能中的容量值 capacity = resize;

爲什麼在出庫時更改容量?