2 Stimmen

Bei jedem Methodenaufruf wird ein Element vom Stapel genommen

Ich habe eine Frage zu einem Programm, das einen Stack anregt (und keine eingebauten Stack-Funktionen oder ähnliches verwendet).

stack2= 1 2 3 4 5 //single dimension array of 5 elements

Durch den Aufruf der Methode pop sollte der Stapel wie folgt aussehen, wobei jedes Mal, wenn der Stapel erneut aufgerufen wird, ein Element entfernt wird.

stack2= 1 2 3 4 0  
stack2= 1 2 3 0 0  
stack2= 1 2 0 0 0  
stack2= 1 0 0 0 0  
stack2= 0 0 0 0 0

Hier ist mein Code:

for (int i = 1; i <= 6; i++)
{
    number= TryPop(s2);
    //use number
    ShowStack(s2, "s2");
}

public void Push(int g)
{
    if (top == Max)
    {
        throw new Exception("Stack overflow...");
    }
    else
    {
        tabel[top] = g;
        top++;
    }
}/*Push*/

Ich habe bereits Code, der mein Array mit Werten füllt (durch eine Push-Methode). Die pop-Methode sollte den letzten Wert nehmen und ihn auf 0 setzen, dann den nächsten Stapel aufrufen und den folgenden auf 0 setzen (wie oben in stack2 gezeigt).

Die aktuelle Pop-Methode, die den oberen Index verfolgt (0 Elemente = 0 oben, 1 Element = 1 oben usw.), enthält bereits eine Unterlaufwarnung, wenn dieser auf 0 oder darunter geht (was korrekt ist).

public int Pop()
{
    if(top <= 0)
    {
        throw new Exception("Stack underflow...");
    }
    else
    {
        for (int j = tabel.Length - 1; j >= 0; j--)  
        {
            //...Really not sure what to do here.
        }
    }

    return number; 

}/*Pop*/

Da ich in der anderen Klasse bereits eine Schleife habe ( for Schleife (siehe oben), die den 6-fachen Stapel s2 simuliert. (erster Stapel: 1 2 3 4 0, zweiter Stapel 1 2 3 0 0 und so weiter). Wie genau nehme ich jedes Mal ein Element weg? Entweder habe ich die gesamte Anzeige auf 0 oder die 0 an den falschen Stellen / aus dem Index Fehler.

Edit: Arbeitsmethode Pop:

public int Pop()
{
    if(top <= 0)
    {
        throw new Exception("Stack underflow...");
    }

    top--;
    tabel[top] = 0;
    number = tabel[top];

    return number;
}/*Pop*/

0 Stimmen

Können Sie uns Ihre Push-Implementierung zeigen? Warum, glauben Sie, brauchen Sie eine Schleife in der Pop-Methode?

0 Stimmen

Wenn Sie top to Pop verwenden, achten Sie auf off-by-one-Fehler, da der Index ein Element hinter dem obersten Element auf dem Stapel liegt.

8voto

dtb Punkte 205441

Um einen Stack zu implementieren, benötigen Sie ein Array und einen "Zeiger" auf die Spitze des Stacks.

empty       _ _ _ _ _

In Ihrem Code, table ist das Array und top ist der Zeiger (als Array-Index).

Schieben Sie

Um ein Element auf einen Stapel zu schieben, legen Sie das Element an den Anfang des Stapels und schieben den Zeiger um eins vor:

push 1      1 _ _ _ _

push 2      1 2 _ _ _

push 3      1 2 3 _ _

Das ist es, was Ihr Code bereits tut:

table[top] = g;    // insert `g` at `top` into `table`
top++;             // advance `top` by one

Pop

Um ein Element auszublenden, bewegen Sie den Zeiger um eine Position zurück und löschen Sie das Element an der Spitze:

pop 3       1 2 _ _ _

pop 2       1 _ _ _ _

pop 1       _ _ _ _ _

Versuchen Sie nun, Ihre Lösung für Push so zu übersetzen, dass sie umgekehrt funktioniert, wie hier gezeigt!

0 Stimmen

Vielen Dank für die gut gezeichnete Illustration. Die Sache ist, dass ich nicht zu adressieren, weil meine Push eine leere Methode ist. Wo mein Pop muss ein int mit einem einzigen Rückgabetyp sein. Der Push-Wert verwendet eine specifiek Zahl zu schieben, aber wie genau rufe ich auf diesen Wert (Index)? table[top] = // alles ergibt sich aus Index.

0 Stimmen

@Sef: Bitte konzentrieren Sie sich auf Folgendes: "Bewegen Sie den Zeiger um eins zurück und kehren Sie zum obersten Element zurück". Können Sie versuchen, dies zu implementieren und Ihre Lösung zu posten?

0 Stimmen

Vielen Dank für die vielen Anregungen! Platziert den Code in der op am unteren Rand. Mein Problem war ich war Platzierung der oben - in der falschen Reihenfolge, was in aus dem Index Fehler die ganze Zeit. Vielleicht noch eine kleine Frage. Ich musste einen Stringbuider verwenden, um mir die gewünschten Ergebnisse anzeigen zu können (sonst bekomme ich den Klassennamen und das war's). Gibt es noch eine andere Möglichkeit außer dem Stringbuilder, dies zu erreichen? Habe dies nicht wirklich gesehen, und vielleicht sollte ich dies nicht bereits verwendet haben. Wie auch immer, vielen Dank, sehr viel apperciated!

1voto

Mark Byers Punkte 761508

Sie sollten eine lokale Variable deklarieren result und setzen Sie ihn auf den aktuellen Wert des obersten Stapels, indem Sie top als Index für Ihre Daten. Dann dekrementieren Sie Ihre top Variable und Rückgabe result . Da es sich um eine Hausaufgabe handelt, werde ich den Code nicht veröffentlichen - Sie sollten versuchen, ihn selbst zu implementieren, um sicherzustellen, dass Sie ihn verstehen.

Es ist nicht notwendig, eine Schleife zu implementieren Pop . Es ist auch nicht notwendig, die Werte beim Entfernen auf Null zu setzen, obwohl Sie dies tun können, wenn Sie es wünschen.

Sie sollten auch beachten, dass diese Implementierung nicht thread-sicher ist. Das ist in Ordnung, aber stellen Sie sicher, dass dies klar dokumentiert ist.

0voto

Thomas Punkte 160390

Sie sollten nicht mit einer for Schleife in Pop() . Sie entfernen nur ein Element, und Sie kennen die Position dieses Elements (es befindet sich bei Index top ), so dass Sie sich nur mit diesem Element des Stapels befassen müssen.

0voto

anonymous Punkte 3344

Unter der Annahme, dass top auf das obere Ende des Stapels verweist, sollte es ausreichen, den Wert am oberen Ende des Stapels auf 0 zu setzen und top zu dekrementieren.

public int Pop()
{
    if(top < 0)
    {
        throw new Exception("Stack underflow...");
    }
    else
    {
        table[top] = 0;
        top--;
    }

    // not sure where number comes from
    return number; 

}/*Pop*/

0 Stimmen

Hallo, Ja, oben wird angezeigt, wie viele Elemente sich derzeit auf dem Stapel befinden (oben 5 für einen vollen Stapel mit 5 Elementen). Obwohl jedes Mal, wenn ich etwas versuchen (auch mit dem Code oben) bekomme ich out of index Fehler. Prost.

0 Stimmen

@Sef, dann musst du wahrscheinlich deinen kompletten Code posten. Dein top könnte aus dem Array heraus zeigen. Unter der Annahme, dass Ihr Stack ein Array mit 5 Ganzzahlen ist, ist top gültig, wenn es 0 (erstes Element) bis 4 (letztes Element) ist. Alles andere führt zu Out-of-Bounds-Ausnahmen.

0voto

used2could Punkte 4958

Ich bin mir sicher, dass ich für diese Antwort angefeindet werden werde, aber ich weiß, was ich an seiner Stelle an einem Sonntag wollen würde. Ich hoffe, dass die Antwort von dtb die meisten Stimmen bekommt, weil sie es für eine hervorragende Erklärung eines Stapels verdient hat!

Hier ist ein einfaches Beispiel für einen Stapel. Bitte lernen Sie es und fügen Sie es nicht einfach in Ihre Hausaufgaben ein.

public class Stack<T>
{
    public int Count { get; private set; }
    private int _CurrentPosition;
    private T[] _Values;

    public Stack(int capacity)
    {
        _CurrentPosition = -1;
        _Values = new T[capacity];
        Count = capacity;
    }

    public T Peek()
    {
        if (_CurrentPosition < 0)
            return default(T);

        return _Values[_CurrentPosition];
    }

    public void Push(T item)
    {
        if (_CurrentPosition == Count)
            throw new Exception("Stack overflow...");

        _CurrentPosition++;
        _Values[_CurrentPosition] = item;
    }

    public T Pop()
    {
        if(_CurrentPosition < 0)
            throw new Exception("Stack underflow...");
        T item = _Values[_CurrentPosition];
        _Values[_CurrentPosition] = default(T);
        _CurrentPosition--;
        return item;
    }
}

0 Stimmen

<Allgemeine Flamme für die Veröffentlichung der vollständigen Lösung der Hausaufgabenfrage>. Bitte entfernen Sie es.

0 Stimmen

Müssen wir auf die Etikette für Hausaufgaben achten? Gott bewahre, dass er auf eine andere Website geht, die Code-Beispiele enthält. LOL Ich liebe die "<generische Flamme...>"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X