Es ist bekannt, dass eine Maschine mit einem einzelnen Stapel als nur unbegrenztem Speicher nicht vollständig ist, wenn sie nur von der Oberseite des Stapels lesen kann. Ich möchte eine Maschine, die (etwas) leistungsfähiger als eine Stapelmaschine ist, aber immer noch nicht vollständig ist. (Ich frage mich, ob es eine nicht-Turing-vollständige Maschine gibt, die nicht deterministische Pushdown-Automaten mit einer einzigen polynomiellen Verlangsamung deterministisch simulieren kann.) Die harmloseste (unkomplizierte) Erweiterung, die mir in den Sinn kam, war eine (einzelne) Vorwärtsbewegung Iterator lesen.
Lassen Sie mich die Implementierungsdetails näher erläutern, um zu verdeutlichen, was ich unter einem Forward-Read-Iterator verstehe. Eine einfach verknüpfte Liste kann zum Implementieren eines Stapels verwendet werden. Lassen Sie die Liste durch einen Zeiger implementiert werden pTop, der entweder Null ist oder auf einen SListKnoten zeigt. Ein SListKnoten besteht aus einem Nutzlastfeld valueund einem Zeigerfeld pNext, wobei pNextentweder Null ist oder auf einen SListKnoten zeigt. Lassen Sie den Vorwärtslese-Iterator durch einen Zeiger implementiert werden pRead, der entweder Null ist oder auf einen SListKnoten zeigt. Die Zeiger pTopund pReadkönnen nicht direkt aufgerufen werden, sondern können nur über die folgenden Methoden verwendet werden:
Push(val)Erstellt einen neuenSListKnotennmitn.value = valundn.pNext = pTopund setztpTop = &n.Pop()bricht ab, wennpTop == 0oderpRead == pTop. Andernfalls liestval = pTop->valueundpTopNext = pTop->pNextgibt es denSListKnoten frei, auf den es zeigtpTop, setztpTop = pTopNextund gibt ihn zurückval.ReadBegin()setztpRead = pTop.ReadNext()bricht ab wennpRead == 0. Andernfalls liestval = pRead->value, setztpRead = pRead->pNextund kehrt es zurückval.ReadFinished()gibttrueifpRead == 0undfalseandernfalls zurück.
pTop == 0undpRead == 0. Eine Methode,ReadCancel()die setzt,pRead = 0könnte auch eine gute Idee sein, da sonst der Abbruch vonPop()forpRead == pTopärgerlich sein könnte.