タグ付けされた質問 「stacks」

1
これらの文字列操作をサポートする「文字列スタック」データ構造はありますか?
次の操作を実行できる文字セット文字列セットを格納するデータ構造を探しています。文字列のセットSを格納するデータ構造としてD(S )を示します。ΣΣ\SigmaD(S)D(S)\mathcal{D}(S)SSS Add-Prefix-Set上に:いくつかのセットの所定のT大き定数によって制限され、その文字列の長さが一定で、戻りによって囲まれている文字列(空)の、D({ T Sを| T ∈ T 、S ∈ S } )。これらの境界定数は両方ともグローバルです。これらはすべての入力Tで同じです。D(S)D(S)\mathcal{D}(S)TTTD({ts | t∈T,s∈S})D({ts | t∈T,s∈S})\mathcal{D}( \{ t s\ |\ t \in T, s \in S\} )TTT Get-Prefixes上の:リターン{ | S ∈ S 、∈ Σ }。O (| Σ |)時間でその内容を列挙できる限り、このセットにどの構造が使用されるかはあまり気にしないことに注意してください。D(S)D(S)\mathcal{D}(S){a | as∈S,a∈Σ}{a | as∈S,a∈Σ}\{ a \ | \ as \in S, …


6
1つの配列に2つのスタックを実装する方法は?
まず、これは宿題の問題ではないと言いたいです。私はアルゴリズムの紹介-優れたプログラマーになるための有名なCLRSテキストを読んでいます。私はこの本で与えられた問題と演習を自分で解決しようとしています。 私が解決しようとしているエクササイズ10.1-2をから第10章基本データ構造 CLRS第二版から。その状態は次のとおりです。 1つの配列A [1..n]に2つのスタックを実装する方法を説明します。両方のスタックの要素の合計数がnでない限り、どちらのスタックもオーバーフローしないようにします。PUSHおよびPOP操作はO(1)時間で実行する必要があります。 私がこれまでに考え出した解決策は次のとおりです。 配列A [1..n]がS1 [1..i]とS2 [i..n]の 2つのスタックを実装するようにします。 用PUSH-S1およびPUSH-S2操作、スタックが「満杯」である場合、その後に要素をプッシュスタート他のスタック(例えば、スタック場合S1は新しい要素を押し込むことしようとしているときに一杯になった後にその要素をプッシュスタックS2およびその逆)。 このアプローチの問題は、どの要素がどのスタックに属しているかを「記憶」する方法がないため、POP-S1またはPOP-S2を確実に使用できないことです。スタックの要素が(キー、値)のペアであり、キーがスタック番号である場合、要素をポップするには、最悪の場合、iまたは(ni)回-O(n )(ここで間違っている場合は、お気軽に修正してください)、これはO(1)ではありません。 私はかなり長い間質問に頭を打ち続けてきました。私は正しい軌道に乗っていますか?誰かがこの問題を解決するための私の可能なポインターを与えることができますか? 一般に、これらの問題についてどのように「考える」べきですか?または、本当に知的な人だけがこの種の問題を解決できますか?これらのような問題に取り組む/解決する(つまり、経験を積む)ことで、私はこれで良くなりますか? 悟りを待っています。

2
スタックベースのプログラミング言語を同時に実行することはできますか?
FORTHやCatなどのスタックベースのプログラミング言語について読んでいますが、その性質を考えると、パラダイムに関係なく、一度に1つのアクションしか実行できないようです(FORTHは必須ですが、Catは機能的です)。 命令型言語はスタックを変更し、Joyなどの純粋に機能的な言語は新しいスタックを返しますが、ポイントは一度に1つのスタックのみが使用されることです。 それでは、スタックベースのプログラミング言語は並行することができますか?複数のスタックを同時に使用するなどして、並行性を実現できますか? スタックベースのプログラミング言語で遅延評価を実装することは可能ですか? 上記の言語と概念について誤解している場合は修正してください

1
スタックの順序を検出する方法は?
整数のシーケンスを 111 に んんn、順番に1つずつスタックにプッシュします。各プッシュの間に、スタックから任意の数のアイテムをポップすることを選択できます(0から現在のスタックサイズまで)。 スタックから値をポップするたびに、それを出力します。 例えば、 1 、2 、31、2、31,2,3するとプリントアウトされますpush, pop, push, pop, push, pop。3 、2 、13、2、13,2,1から来ていpush, push, push, pop, pop, popます。 しかしながら、 3 、1 、23、1、23,1,2 することができないため、可能なプリントアウトではありません 333 印刷された後に 111、見ずに 222 間に。 質問:次のような不可能な注文をどのように検出できますか?3 、1 、23、1、23,1,2? 実際、私の観察に基づいて、私は潜在的な解決策を見つけました。しかし問題は私が私の観察が完全であることを証明できないことです。 私が次のロジックで書いたプログラム: 現在の値から次の値を差し引いた値が1より大きい場合、現在と次の間の値は次の後に表示できません。たとえば、current = 3およびnext = 1の場合、current(3)とnext(1)の間の値は2であり、next(1)の後には表示されないため、3 、1 、23、1、23,1,2 ルールに違反しています。 これはすべてのケースをカバーしますか?

2
フォワードリードイテレーターチューリングを備えたスタックマシンは完成していますか?
スタックの先頭からしか読み取ることができない場合、ストレージが無制限の単一スタックのマシンはチューリング完了ではないことはよく知られています。スタックマシンよりも(少し)強力なマシンが必要ですが、それでもチューリングは完全ではありません。(多項式のスローダウンのみで非決定論的なプッシュダウンオートマトンを決定論的にシミュレートできる非チューリング完全なマシンが存在するかどうか疑問に思います。)私の頭に浮かんだ最も良性の(まっすぐな)拡張は、(単一の)前進でした。イテレータを読みます。 実装の詳細を詳しく説明して、フォワードリードイテレーターの意味を明確にします。単独リンクリストには、スタックを実装するために使用することができます。リストpTopは、ゼロであるか、SListノードを指すポインターによって実装されます。SListノードは、ペイロードフィールドから構成valueし、ポインタフィールドpNext、pNextのいずれかがゼロであるか、または点SListノード。前方読み取り反復子をpRead、ゼロであるか、SListノードを指すポインターによって実装します。ポインタpTopにpReadは直接アクセスできませんが、次の方法でのみ使用できます。 Push(val)およびで新しいSListノードnを作成し、を設定します。n.value = valn.pNext = pToppTop = &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それ以外の場合はを返します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.