In einem reinen Stapel, die einzige zulässigen Operationen sind Push
, Pop
und Peek
doch in der Praxis, das ist nicht ganz richtig. Oder besser gesagt, die Peek
Operation ermöglicht es Ihnen oft, jede Position auf dem Stapel zu betrachten, aber der Haken ist, dass sie relativ zu dem einen Ende des Stapels ist.
Wie andere gesagt haben, handelt es sich bei einem Array um einen Direktzugriff, und alles bezieht sich auf den Anfang des Arrays .
In einem Stapel können Sie nur am Arbeitsende des Stapels hinzufügen / entfernen, aber Sie haben immer noch Lesezugriff, aber es wird auf das Arbeitsende verwiesen . Das ist der grundlegende Unterschied.
Wenn Sie beispielsweise Parameter auf einem Stapel an eine Funktion übergeben, muss der Angerufene die Parameter nicht entfernen, um sie anzuzeigen. Es werden nur lokale Variablen auf den Stapel verschoben und alle lokalen Variablen und Parameter basierend auf einem Versatz vom Stapelzeiger referenziert. Wenn Sie nur ein Array verwenden würden, wie würde der Angerufene dann wissen, wo er nach seinen Parametern suchen muss? Wenn der Angerufene fertig ist, löscht er seine lokalen Variablen, gibt einen Rückgabewert aus, gibt die Kontrolle an den Aufrufer zurück, und der Aufrufer gibt den Rückgabewert (falls vorhanden) und dann die Parameter vom Stapel. Das Schöne ist, dass es funktioniert, egal wie weit Sie in Ihren Funktionsaufrufen verschachtelt sind (vorausgesetzt, Ihnen geht nicht der Stapelspeicher aus).
Das ist eine bestimmte Verwendung / Implementierung, aber es zeigt den Unterschied: Array wird immer von Anfang an referenziert, aber Stapel werden immer von einer funktionierenden Endposition aus referenziert.
Eine mögliche Implementierung eines Stapels ist ein Array plus ein Index, um sich zu merken, wo sich das Arbeitsende befindet.