スタックの先頭からしか読み取ることができない場合、ストレージが無制限の単一スタックのマシンはチューリング完了ではないことはよく知られています。スタックマシンよりも(少し)強力なマシンが必要ですが、それでもチューリングは完全ではありません。(多項式のスローダウンのみで非決定論的なプッシュダウンオートマトンを決定論的にシミュレートできる非チューリング完全なマシンが存在するかどうか疑問に思います。)私の頭に浮かんだ最も良性の(まっすぐな)拡張は、(単一の)前進でした。イテレータを読みます。
実装の詳細を詳しく説明して、フォワードリードイテレーターの意味を明確にします。単独リンクリストには、スタックを実装するために使用することができます。リストpTop
は、ゼロであるか、SList
ノードを指すポインターによって実装されます。SList
ノードは、ペイロードフィールドから構成value
し、ポインタフィールドpNext
、pNext
のいずれかがゼロであるか、または点SList
ノード。前方読み取り反復子をpRead
、ゼロであるか、SList
ノードを指すポインターによって実装します。ポインタpTop
にpRead
は直接アクセスできませんが、次の方法でのみ使用できます。
Push(val)
およびで新しいSList
ノードn
を作成し、を設定します。n.value = val
n.pNext = pTop
pTop = &n
Pop()
pTop == 0
またはの場合は中止しpRead == pTop
ます。それ以外の場合は、が指すノードを読み取っval = pTop->value
てpTopNext = pTop->pNext
解放SList
しpTop
、を設定pTop = pTopNext
して返しますval
。ReadBegin()
セットpRead = pTop
。ReadNext()
場合は中止しますpRead == 0
。それ以外の場合は、読み取りval = pRead->value
、設定pRead = pRead->pNext
、および戻りますval
。ReadFinished()
のtrue
場合pRead == 0
は、false
それ以外の場合はを返します。
pTop == 0
とpRead == 0
。メソッドReadCancel()
のセットはpRead = 0
のそれ以外の場合は中止ためにも、良いアイデアかもしれないPop()
ためにはpRead == pTop
迷惑かもしれません。