Une machine de pile avec un itérateur de lecture en avant est-elle complète?
-
02-11-2019 - |
Question
Il est bien connu qu'une machine avec une seule pile car seul le stockage illimité n'est pas complet, s'il ne peut lire que dans le haut de la pile. Je veux une machine qui est (légèrement) plus puissante qu'une machine à pile, mais toujours pas complète. (Je me demande s'il existe une machine complète non touchante, qui peut simuler de manière déterministe n'importe quel automate non déterministe avec un seul ralentissement polynomial.) L'extension la plus bénigne (simple) qui me venait à l'esprit était une (simple) avant Lisez itérateur.
Permettez-moi d'élaborer les détails de la mise en œuvre, pour indiquer clairement ce que je veux dire par un itérateur de lecture avant. UN Liste liée individuellement Peut être utilisé pour implémenter une pile. Que la liste soit implémentée par un pointeur pTop
, qui est soit zéro, ou pointe vers un SList
nœud. Un SList
Le nœud se compose d'un champ de charge utile value
et un champ de pointeur pNext
, où pNext
est soit zéro, soit indique un SList
nœud. Laissez l'itérateur de lire vers l'avant être implémenté par un pointeur pRead
, qui est soit zéro, ou pointe vers un SList
nœud. Les pointeurs pTop
et pRead
ne peut être accessible directement, mais ne peut être utilisé que via les méthodes suivantes:
Push(val)
crée un nouveauSList
nœudn
avecn.value = val
etn.pNext = pTop
, et ensemblespTop = &n
.Pop()
abandonne sipTop == 0
oupRead == pTop
. Sinon, il litval = pTop->value
etpTopNext = pTop->pNext
, libère leSList
nœud pointé parpTop
, setspTop = pTopNext
et revientval
.ReadBegin()
setspRead = pTop
.ReadNext()
abandonne sipRead == 0
. Sinon, il litval = pRead->value
, setspRead = pRead->pNext
et revientval
.ReadFinished()
Retourtrue
sipRead == 0
, etfalse
Par ailleurs.
Pas de solution correcte