2017-09-22 2 views
0

J'utilise arraylist pour implémenter une file d'attente. Tout va bien, sauf quand j'essaie de trouver la valeur minimale de la file d'attente, cela ne fonctionne pas correctement et les fonctions dequeue et peek pour une raison quelconque ne fonctionnent pas comme prévu. J'ai essayé de passer par la ligne par ligne, mais je ne comprends pas ce qui va mal dans la fonction min():Java: Vous n'arrivez pas à trouver la valeur minimale d'une file d'attente?

public class queuePractice { 

static ArrayList<Integer>nums = new ArrayList<Integer>(); 
static int top = -1; 

public static void main(String[] args) { 
    enqueue(5); 
    enqueue(2); 
    enqueue(6); 
    enqueue(3); 
    enqueue(12); 
    enqueue(1); 
    enqueue(20); 

    System.out.println("The min is: " + min()); 
} 

public static int peek() { 
    return nums.get(0); 
} 

public static void enqueue(int x) { 
    nums.add(++top, x); 
} 

public static int dequeue() { 
    top--; 
    return nums.remove(0); 
} 

public static void display() { 
    for(int x = 0; x <=top; x++) { 
     System.out.print(nums.get(x) + " "); 
    } 
    System.out.println(); 
} 

public static boolean isEmpty() { 
    return top==-1; 
} 

public static int min() { 
    int min = Integer.MAX_VALUE; 
    while(min > peek()) { 
     min = peek(); 
     dequeue(); 

    } 
    return min; 
} 
} 

La fonction PEEK revient sans cesse 2 reprises, même si je change la boucle while à un pour la boucle. Pour une raison quelconque, il ne met pas à jour sa valeur à chaque fois que je l'efface? Mais en parcourant ligne par ligne je ne peux pas comprendre ce qui ne va pas.

Répondre

0

Un plus facile meth od serait

List<Integer>nums = Arrays.asList(5,2,35,6); // or use your enqueue 

    Iterator<Integer> it = nums.iterator(); 

    int min = Integer.MAX_VALUE; 
    while (it.hasNext()) { 
     Integer i = it.next(); 
     min = Math.min(i, min); 
    } 
    System.out.println(min); 

Bien sûr, tout type de boucle autour de la liste travaillerait

+0

Ah je vois maintenant. La déclaration min> peek l'a fait tourner en rond. – hse23

+0

ou demi-cercles de toute façon –

0

Voulez-vous dire que votre code imprime 2 tout le temps? En effet, votre min de la méthode() se terminent toujours sur 2

Première itération votre int valeur minimum sera de 5

Deuxième itération votre int valeur minimum sera de 2

troisième itération votre boucle sortie depuis 2 est pas plus de 6

Ensuite, votre méthode retourne 2

espère que cela aide

+0

Je vois la logique, mais je ne comprends pas pourquoi il est terminer quand je suis perdre une boucle while et non une boucle ? Il ne devrait pas y avoir de contraintes ici, n'est-ce pas? Dequeue ne devrait pas affecter n'importe quoi puisque c'est simplement l'arraylist utilisant sa propre fonction pour enlever un index correctement. Donc, le problème réside dans la fonction peek()? Mais cela fait la même chose, en retournant simplement la valeur de l'index de 0. – hse23

+0

Vous devez parcourir tous les éléments, mais votre boucle ne fait que boucler tandis que 'min> peek()' –