2011-08-24 3 views
0

Mon code compile mais ne fonctionne pas. Je pense que je n'ai pas classé correctement? et quelqu'un peut-il m'expliquer wrapIdx méthode retour index% capacité. Je ne comprends pas vraiment comment ce code enveloppe le tableau. quand il atteint la fin de l'index de tableau% de capacité retournera 1, mais un tableau ne commence pas à 0 index?Queue RingBuffer implémente Queue12. Ne fonctionne pas

Voici mon code, j'implémente une interface Queue12. Après que je l'ai fait fonctionner, serai-je en mesure de faire une classe de test pour vérifier si cela fonctionne?

import java.util.NoSuchElementException; 


public class QueueImpl12<T> implements Queue12<T> 
{ 

private int _size, _backIdx, _frontIdx; 
private static final int _defaultCapacity = 128; 
private T[] _ringBuffer; 



public QueueImpl12(int capacity) 
{ 
    _ringBuffer = (T[]) new Object[capacity]; 
    clear();  
} 


public QueueImpl12() 
{ 
    _ringBuffer = (T[]) new Object[_defaultCapacity]; 
    clear(); 
} 

private int wrapIdx(int index) 
{ 

    return index % capacity(); 
} 



public void clear() 
{ 
    _backIdx = 0; 
    _frontIdx = 0; 
    _size = 0; 

} 

@Override 
public int capacity() 
{ 
    // TODO Auto-generated method stub 
    return _ringBuffer.length; 
} 

@Override 
public int size() 
{ 
    // TODO Auto-generated method stub 
    return _size; 
} 

@Override 
public boolean enqueue(T o) 
{ 
    //add o to back of queue 


    if(_ringBuffer.length == _size) 
    { 
     return false; 
    } 


     _ringBuffer[_backIdx] = o; 
     _backIdx = wrapIdx(_backIdx + 1); 
     _size++; 





    return true; 
} 

@Override 
public T dequeue() 
{ 
    if(_size == 0) //empty list 
    { 
     throw new NoSuchElementException(); 
    } 

    T tempObj = _ringBuffer[_frontIdx];  //store frontIdx object 
    _ringBuffer[_frontIdx] = null;   
    _frontIdx++; 



    _size--; 
    return tempObj; 
} 

@Override 
public T peek() 
{ 

    return _ringBuffer[_frontIdx]; 
} 

} 

Répondre

1

La première chose à noter ici est que l'opérateur modulo % retourne le reste d'une division. N'importe quel nombre modulo lui-même est 0, donc quand vous frappez la capacité maximum de la file d'attente il renverra 0, qui est l'index que vous commencerez à. Si le code renvoie 1 à la fin, vous avez un problème.

+0

L'index avant est-il le même que l'index actuel? – earbulan

+0

uniquement lorsque le front et le courant sont égaux '0' – Woot4Moo

Questions connexes