2013-11-22 41 views
1

所以我被要求在數組中執行隊列,直到我看到在出隊並嘗試排隊另一個值之後我正在獲得一個有趣的輸出時,我沒有遇到任何麻煩...
例如(輸出):隊列實現爲Array

Queue: [1]  //Enqueue 1 
Queue: [1, 2] //Enqueue 2 
Queue: [2]  //Dequeue 
Queue: [2, 2] //Enqueue 3 
Queue: [2, 2, 3] //Enqueue 4 
Queue: [5, 2, 3, 4] //Now is a total mess... 

我的代碼包含隊列,dequeque和調整方法的一切工作不錯,我真的沒有在所有的如何瞭解決這個問題的任何想法... 這裏是我的代碼與主如果你想嘗試它。謝謝。

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

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

     queue.enqueue(1); 
     System.out.println("Queue: "+ queue); 
     queue.enqueue(2); 
     System.out.println("Queue: "+ queue); 
     queue.dequeue(); 
     queue.enqueue(3); 
     System.out.println("Queue: "+ queue); 
     queue.enqueue(4); 
     System.out.println("Queue: "+ queue); 
     queue.enqueue(5); 
     System.out.println("Queue: "+ queue); 

    } 
} 

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 

    public Queue(int size) 
    { 
     capacity = size; 
     count = 0; 
     back = size-1; 
     front = 0; 
     elements =(E []) new Object[size]; //queue 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 &lt; count; i++) 
     { 
      tmp[i] = elements[current]; 
      current = (current + 1) % count; 
     } 

     elements = tmp; 
     front = 0; 
     back = count-1; 
     capacity=reSize; 

    } 


    //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()) { 
      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; 
    } 
} 
+1

你爲什麼容量降低,當你出列? –

+0

這在我的機器上按預期工作......我得到[1],[1,2],[2],[2,3],[2,3,4]和[2,3,4,5 ]。 – jn1kk

+0

多數民衆贊成在奇怪,因爲我不斷獲得重複的數字和數字放置在一個隨機索引...你在哪裏試過它? –

回答

2

您正在使用當前值back更新enqueue()方法中的back,但是您根本沒有在dequeu()方法中更新它。這不會正常工作。實際上,你應該根據count來計算back

只要改變:

back = (back + 1) % capacity; 

到:

back = count % capacity; 
+0

Thankkkkk youuuu先生,你讓我的一天!這工作! :) –

+0

@LithithDeficiency不客氣:) –

1

dequeue您沒有更新back變量確定在其上用添加enqueue新值的位置。此外,如果您有count只是1,您可以從索引1複製索引0上不存在的值。這是一種特殊情況,如果您創建了容量(大小)爲1的隊列,將隊列入隊並將隊列出隊,那麼將會出現界限錯誤。