1

ええ、私の友人の 1 人が、インデックスを使用してスタックをトラバースできると言っていましたが、彼は間違っていると思います。基本的に、配列を使ってアルゴリズムを書かなければならない宿題があります。これを行うには 2 つの for ループを使用する必要があったため、スタックで次のようなことを行う方法を考えていました。

for(int i = 0; i < n; i++)
{
    for(int j = 0; j < n; j++)
    {
        x = A[i]+A[j]
    }
}

仕方がないですよね?pop() と push() を使用する必要があるのは、必要なことを行うためだけですよね? 配列とスタックを同時に使用したため、友人の 1 人がそれはできないと言いました。配列を使用してスタックを実装できることはわかっていますが、スタック ADT にはインデックスがありません (ただし、スタックとスタック ADT ではありません)。

4

6 に答える 6

1

「スタック」は抽象的な概念であり、現実に存在するものではありません。現実の世界では、これらは通常、連続したメモリ アドレスのデータとして実装されるため、使用している言語/ライブラリ/API によっては、インデックスを作成することは確かに可能です。特定の言語やライブラリがなければ、あなたのような質問に答える方法はありません。

あなたが本当に意味するのは、プッシュ/ポップによってのみアクセスできる2つのデータコレクションであなたが言及した計算を行う方法はありますか?おそらく中間配列なしではありません. しかし、なぜあなたはしたいのですか?スタックは、その性質上、LIFO 方式でデータにアクセスするだけでよいアルゴリズムに使用することを目的としています。他になぜあなたはそれを使うのですか?

于 2013-06-06T02:19:13.680 に答える
1

実際、あなたはすべて間違っています(tm)! 2 つのスタック (「純粋な」スタック) を使用すると、非効率的に配列を実装できます。スタック S1 に 10 個のアイテムがプッシュされていて、アイテム 5 が必要だとします。S1 から 4 つのアイテムをポップし、それぞれを S2 に順番にプッシュします。次に、もう 1 つポップオフすると、それがアイテムになります。現在使用されている (どちらのスタックにもない) アイテムのインデックスを追跡するだけで、必要なときにいつでも他のアイテムを取得できます。

しかし、この考えはばかげています。

于 2013-06-06T03:54:50.987 に答える
0

スタックにはインデックスがあります。スタックの実装方法に応じて、配列またはリンク リストを使用して配列内のスタックを実装できます。インデックスは左から右にゼロから開始されます。しかし、どちらの方法でもインデックス作成を行うことができます。

  1. 一番上の要素を一番下の要素に積み重ねる
  2. 一番下の要素から一番上の要素へ
于 2021-01-21T17:14:42.260 に答える