2017-12-09 4 views
0
package java.util; 
public 
class Stack<E> extends Vector<E> { 
    public Stack() { 
    } 

    public E push(E item) { 
     addElement(item); 
     return item; 
    } 

    public synchronized E pop() { 
     E obj; 
     int len = size(); 

     obj = peek(); 
     removeElementAt(len - 1); 

     return obj; 
    } 

    public synchronized E peek() { 
     int  len = size(); 

     if (len == 0) 
      throw new EmptyStackException(); 
     return elementAt(len - 1); 
    } 

    public synchronized int search(Object o) { 
     int i = lastIndexOf(o); 

     if (i >= 0) { 
      return size() - i; 
     } 
     return -1; 
    } 


    private static final long serialVersionUID = 1224463164541339165L; 
} 

Oben ist der Java-Quellcode für Stack. erkannte ich, dass es nur einen Stapel emuliert und nicht eine echte one.So meine FragenIst diese Stack- oder Stack-Emulation?

  1. Am I zu Recht sagen, dass dies nur eine Nachahmung des Stack ist und nicht der echte?
  2. Wenn ich die oben sagen kann, und ich will es von Grund auf neu bauen, wie würde ich es tun? (Arrays mit fester Größe oder Arraylist, die wiederum verwendet Liste (single/double verbunden sind)?)
+0

Oben ist ein Link zu allen Dingen namens Stack in Grepcode. Worum fragst du eigentlich? –

+0

'java.util.Stack' ist eine Implementierung einer Stack-Datenstruktur. Ich bin mir nicht sicher, was Sie mit "Emulation" meinen. – 4castle

+0

Ich meine auf einer fundamentalen Ebene denke ich, dass Stacks auf Arrays laufen sollten, die wiederum auf Speicherreferenzen laufen. Die obige Klasse implementiert also Listen und Sammlungen. Daraus folgen meine obigen Fragen. – magpie

Antwort

2
  1. Es gibt keinen "echten Stack", ein Stack ist nur eine Idee, ein sogenannter abstract data type. Es unterstützt zwei Operationen, Push und Pop, und die Reihenfolge der Elemente ist als Last-In-First-Out (LIFO) definiert. Zusätzlich zu java.util.Stack (basierend auf Vector, das Array-basiert ist), haben Sie auch java.util.LinkedList (eine doppelt verknüpfte Liste), die auch Stack-Operationen unterstützt, also ist es auch ein Stack so viel wie der andere .. Es gibt mehrere andere Implementierungen, zum Beispiel alle Implementierungen von java.util.Deque.

  2. Sie können es von Grund auf in einer Reihe von Möglichkeiten tun, jedes hat seine eigenen Kompromisse. Ihre Frage ist nicht ausreichend für eine gute Antwort definiert.

+0

Ich verstehe es. Nun, hier ist mein Argument java.util.Stack implementiert verknüpfte Liste, die in erster Linie Warteschlangen sind. Dieser abstrakte Datentyp sollte also eine unabhängige Implementierung haben. Aber das ist nicht, was hier passiert. Daher sage ich, es imitiert den Stapel. – magpie

+0

Es spielt keine Rolle, ob es in erster Linie X ist, noch ist es möglich, zu sagen, ob LinkedList in erster Linie eine Warteschlange, ein Stack, eine Deque oder eine Liste ist - all das ist möglich, weil Sie es als all dies verwenden können. – xs0

+0

Wenn LinkedList "einen Stapel imitiert", dann sind alle Stapelimplementierungen "einen Stapel nachahmen". Wenn LinkedList "ein Stack" ist, dann sind alle Stack-Implementierungen "Stacks". Die Unterscheidung, die du machst, macht keinen Sinn, denn ein Stack ist nur eine Idee, ein Vertrag, ein Protokoll, wenn du willst. Sie könnten einen Stapel mit einem Drucker, einem Roboterarm und einem Scanner implementieren, und das wäre schrecklich komplex und ineffizient, aber Sie könnten und würden einen Stapel genauso imitieren/imitieren wie LinkedList. – xs0

Verwandte Themen