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 SList
Knoten zeigt. Ein SList
Knoten besteht aus einem Nutzlastfeld value
und einem Zeigerfeld pNext
, wobei pNext
entweder Null ist oder auf einen SList
Knoten zeigt. Lassen Sie den Vorwärtslese-Iterator durch einen Zeiger implementiert werden pRead
, der entweder Null ist oder auf einen SList
Knoten zeigt. Die Zeiger pTop
und pRead
können nicht direkt aufgerufen werden, sondern können nur über die folgenden Methoden verwendet werden:
Push(val)
Erstellt einen neuenSList
Knotenn
mitn.value = val
undn.pNext = pTop
und setztpTop = &n
.Pop()
bricht ab, wennpTop == 0
oderpRead == pTop
. Andernfalls liestval = pTop->value
undpTopNext = pTop->pNext
gibt es denSList
Knoten frei, auf den es zeigtpTop
, setztpTop = pTopNext
und gibt ihn zurückval
.ReadBegin()
setztpRead = pTop
.ReadNext()
bricht ab wennpRead == 0
. Andernfalls liestval = pRead->value
, setztpRead = pRead->pNext
und kehrt es zurückval
.ReadFinished()
gibttrue
ifpRead == 0
undfalse
andernfalls zurück.
pTop == 0
undpRead == 0
. Eine Methode,ReadCancel()
die setzt,pRead = 0
könnte auch eine gute Idee sein, da sonst der Abbruch vonPop()
forpRead == pTop
ärgerlich sein könnte.