0

JavaScript でスタックを実装しています。

検討:

Stack{0,1,2,3} Top:0

ここで、ユーザーは値 2 をポップします。

Stack{0,1,3} Top:0

これはスタックの許容可能な動作ですか? 私は自分のスタックをローリングしていますが、これを行う組み込みのコードはありますか?

私のコード:

function Stack() //Creating Stack Object
{
    // Create an empty array of cards.
    this.cards = new Array();  //Cards array inside stack object
    this.push  = pushdata;     //Call pushdata function on push operation
    this.pop   = popdata;      //Call popdata function on pop operation
    this.printStack = showStackData; //Call showStackData function on printstack operation
}

function pushdata(data)
{
    this.cards.push(data);
}

function popdata(data)
{
    return this.cards.pop();
}

function showStackData()
{
    return this.cards;
}

var a = new Stack(); //Create stack Object
a.push(12);          //Push Data onto Stack
a.push(32);
a.push(42);
var z = a.pop();
document.write("Data Popped: " + z);
document.write("Stack Output: " + a.printStack());

スタックがこのアプリケーションの正しいタイプのデータ構造でない場合、正しいタイプはどれですか?

4

3 に答える 3

8

上記の操作をスタックで行うのは合法ですか?

これは従来のスタック操作ではありません。それを可能にするデータ構造は、実際にはスタックとは言えません。それはもっと単純な古いリストです。

スタックが top と start の間のデータの削除を許可しない場合、上記のロジックのために JavaScript で使用されるデータ構造の変更は何ですか?

単純なArrayに何か問題がありますか? それはあなたが望むランダムアクセスアイテムの書き込みを提供します:

var a= [0, 1, 2, 3];
a.splice(1, 1);
// a==[0, 2, 3]

さらに、フロントロード スタックとテール スタック (およびその結果キュー) の両方にアクセスするためのスタック スタイルの便利なメソッド: push/pop/shift/unshift。

Array() が既に IMO をカバーしている場合、独自の Stack() ラッパー クラスを作成する意味はあまりありません。コンピューター科学者は、スタックのリンクされたリストのアルゴリズムの複雑さなどに関心があるかもしれませんが、実際には、最新の JavaScript インタープリターに組み込まれた最適化された Array 実装を上位レベルのコードから改善することはできません。

于 2009-03-10T03:36:44.190 に答える
0

ポップでそれを行うことはできません(途中で他のものをポップすることなく)。ユーザーが数値 2 の場所を見つける別の方法と、配列スプライスを使用するなど、ユーザーがそれを抽出する別の方法を提供することを検討する必要があります。しかし、それまでにこれはもはやスタックではありません。

http://www.w3schools.com/jsref/jsref_splice.asp

于 2009-03-10T03:34:47.893 に答える
0

本当にスタックを使用する必要がある場合は、複数回ポップし、ポップされたデータをプッシュして一時的に別のスタックに保存し、完了したら逆の手順を実行して、スタックの最後を元の場所に戻します。

このようなことは、GUI アプリケーションの元に戻す/やり直し操作によって一般的に行われます。元に戻す操作のスタックと、反対のやり直し操作のスタックがあります。元に戻すはアクションをスタック A から B に移動し、やり直しはアクションをスタック B から A に移動します。新しいアクションは元に戻すスタックにプッシュされ、やり直しスタックが完全に消去されます。

これが使用される別の場所は、ブラウザの戻る/進むリストです。

于 2009-03-10T03:41:58.203 に答える