Queue-Datenstruktur: nach dem Elementen entfernen, das Ergebnis ist immer noch nicht optimal.

morry329

Mitglied
Es geht um den folgenden Queue-Datenstruktur-Code

Java:
package Appendix_D;

import java.util.Arrays;

public class Supermarket {
    static int[] schlange;
    int size;
    int front;
    int rear;
    static int l;

    Supermarket(int data){
        size = data;
        schlange = new int[size];
        front = 0;
        rear = 0;
        l = schlange.length;
    }

    int enqueue(int data){
        if(front == rear && l < 2){
            schlange[rear] = data;
            System.out.println("wow only " + data + " is there");
            return data;
        } else {
            schlange[rear] = data;
            rear++;
        }
        return data;
    }

    void dequeue(){
        int data = schlange[front];
        if(front==size){
            front = 0;
        } else {
                data = schlange[front++];
                System.out.println("deQ-QA!: " + data);
                l--;
        }
    }



    public static void main(String[] args) {
        Supermarket q = new Supermarket(10);
        q.enqueue(8);
        q.enqueue(77);
        q.enqueue(66);
        q.enqueue(145);
        q.enqueue(7198);
        q.enqueue(58);
        q.enqueue(15);
        q.dequeue();
        q.dequeue();

        for(int i = 0; i < l ; i++){
            System.out.println(schlange[i]); //ergebnis ausdrücken 
        }

    }
}

Die Methode enqueue funktioniert wie erwartet, aber die dequeue leider nicht.
Die for-schleife in der main-Methode sollte wie folgt ausdrücken:
66
154
7198
58
15

Aber der Code drückt stattdessen so aus:

8
77
66
154
7198
58
15

Kann jemand mir eine Hilfsstellung geben? Ich bin damit überfordert :/
 
Mir fehlen bei dem Code etwas die Worte. Was machst du da Dinge static?

Und in der Schleife gibst du den Inhalt des ganzen Arrays aus. Du erwartest aber wohl, dass du nur den Rest der Schlange ausgibst. (Und du hast bei der Ausgabe die 0er, die noch kommen, unterschlagen, oder?)
 
Die erste Antwort kam vom Smartphone, aber ich möchte hier doch noch einmal etwas mehr ausholen und eine deutlich umfangreichere Antwort geben.

1. Was direkt negativ aufgefallen ist, sind die static Elemente. Damit kannst Du sinnvoll nur eine Instanz der Klasse haben. Denn die interne Schlange ist ja static und damit von allen Instanzen geteilt. schlange und l würden bei jeder neuen Instanz überschrieben.

Das wird vermutlich einfach nur daher gekommen sein, dass du da halt aus der main Methode drauf zugreifen wolltest. Das ist aber einfach eine Sache, die nicht zu erfolgen hat! Wenn Du etwas mit einer Schlange machen wolltest, dann machst Du das über Zugriffe auf die Instanz. Das kann dann zu einem Code wie hier führen (Inhaltliche Probleme mal außen vor gelassen):
Java:
package de.kneitzel;

public class Supermarket {
    int[] schlange;   // kein static mehr!
    int size;
    int front;
    int rear;
    int l;           // kein Static mehr!

    Supermarket(int data){
        size = data;
        schlange = new int[size];
        front = 0;
        rear = 0;
        l = schlange.length;
    }

    int enqueue(int data){
        if(front == rear && l < 2){
            schlange[rear] = data;
            System.out.println("wow only " + data + " is there");
            return data;
        } else {
            schlange[rear] = data;
            rear++;
        }
        return data;
    }

    void dequeue(){
        int data = schlange[front];
        if(front==size){
            front = 0;
        } else {
            data = schlange[front++];
            System.out.println("deQ-QA!: " + data);
            l--;
        }
    }



    public static void main(String[] args) {
        Supermarket q = new Supermarket(10);
        q.enqueue(8);
        q.enqueue(77);
        q.enqueue(66);
        q.enqueue(145);
        q.enqueue(7198);
        q.enqueue(58);
        q.enqueue(15);
        q.dequeue();
        q.dequeue();

        for(int i = 0; i < q.l ; i++){   // Zugriff auf l in der Instanz q!
            System.out.println(q.schlange[i]); // Zugriff auf schlange der Instanz q!
        }

    }
}

2. Kapselung - Wie was in der Schlange gespeichert wird, interessiert nur die Schlange selbst. Die main Method eist zwar in der gleichen Klasse, aber das ist ja eigentlich dein Programm und gehört nicht zu der eigentlichen Implementation von Supermarket.

Wenn Du also in der Schleife den Inhalt der Schlange ausgeben willst, dann ist das eine Methode der Klasse und die main Methode greift da dann drauf zu. In der main Methode hast Du dann also sowas wie "q.printContent()" und da greifst Du dann auf diverse Dinge zu und gibst diese aus.

3. Implementation der Schlange: Das sieht so erst einmal nicht korrekt aus. Du musst Dir die Operationen deutlich besser überlegen:

Uns fehlt die Spezifikation und was Du genau wie machen willst. Aber sowohl enqueue als auch dequeue sind so nicht korrekt.
Du kannst ja einfach mal mit Deiner Implementation etwas spielen:
Code:
q.enqueue(1);
q.enqueue(2);
q.enqueue(3);
q.enqueue(4);
q.dequeue();
q.enqueue(5);
q.dequeue();
q.enqueue(6);
q.dequeue();
q.enqueue(7);
q.dequeue();
q.enqueue(8);
q.dequeue();
q.enqueue(9);
q.dequeue();
q.enqueue(10);
q.dequeue();
q.enqueue(11);
q.dequeue();
q.enqueue(12);
q.dequeue();
q.enqueue(13);
q.dequeue();
q.enqueue(14);
q.dequeue();
q.enqueue(15);
q.dequeue();
Es sind nie mehr wie 4 Elemente in der Queue aber diese Nutzung wird nicht funktionieren bei Deine Implementation.

Du musst also die ganzen Fälle, die möglich sind, genauer überlegen. Und ich denke, dass Du dann feststellen wirst, dass der Sonderfall mit Queue mit nur einem Element nicht wirklich so behandelt werden muss.

Wenn man Dir mit der Funktionalität der Queue helfen soll, dann braucht man aber deutlich mehr Informationen zu dem gewünschten Verhalten. Was ist, wenn die Queue voll ist? Soll dann überschrieben werden? Oder wie soll dann das Verhalten sein?
 

Zurück
Oben