2

私はC プログラミング言語を読んでいて、スタックを使用して逆ポーランド語電卓を作成する方法を学びました。これに続く演習の 1 つを次に示します。

演習 4-4. ポップせずにスタックの一番上の要素を出力し、それを複製し、一番上の 2 つの要素を交換するコマンドを追加します。スタックをクリアするコマンドを追加します。

「重複」とはどういう意味ですか? スタック全体を出力する、またはスタック全体を自分自身にプッシュする (たとえば、「1 2 3」が「1 2 3 1 2 3」になるように) という意味ですか?

4

2 に答える 2

6

いいえ、スタックの一番上に個々の要素を複製する方が理にかなっています。「一番上の要素を印刷する」は、単数形の「一番上の要素を印刷する」べきだったタイプミスだと思います。

これがはるかに可能性の高いケースである理由は、「トップ要素」を印刷するだけでは意味がないためです最上位の要素以外のスタックのサブセットである場合は、カウントを指定する必要があります (そうではありません)。または、それがすべてを意味する場合は、「最上位」修飾子はまったく必要ありません。

つまり、この場合の主語「it」は、「スタック」ではなく「スタックの一番上の要素」を指します。

したがって、スタックが次の場合:

[1,2,3,4,5]

プッシュされた最初の要素であり、1最後5要素であるため、複製すると次のようになります。

[1,2,3,4,5,5].

push基本的な操作があり、既にあると仮定すると、現在の要素数とスタックの最上位要素をそれぞれ取得するとpopを追加する必要があります (基本的には aですが、削除することはありません)。countpeekpop

残りのコードは、次のような基本的な操作 (疑似コード) から構築できます。

def printTop(stack):
    print stack.peek()

def duplicateTop(stack):
    stack.push(stack.peek())

def swapTopTwo(stack):
    one = stack.pop()
    two = stack.pop()
    stack.push(one)
    stack.push(two)

def clear(stack):
    while stack.count() > 0:
        junk = stack.pop()

基本的な操作を呼び出すよりも強力であると仮定して関数を作成すると、効率が向上する可能性がありますが、これはおそらくそれらを実装する最も簡単な方法です。たとえば、swapTopTwoポップしてプッシュするのではなく、2 つの要素をその場で交換するだけで済みます (_以下の で始まる変数は実装の内部です)。

def swapTopTwo(stack):
    if stack._count < 2: raise error
    temp = stack.data[_count - 2]
    stack.data[_count - 2] = stack.data[_count - 1]
    stack.data[_count - 1] = temp
于 2009-02-08T07:38:15.250 に答える
2

ウィキペディアのスタック指向プログラミング言語のエントリには、スタック操作操作の説明が含まれています。

スタック操作

スタックはスタック指向のプログラミング言語におけるデータ操作の重要な手段であるため、多くの場合、これらの言語はある種のスタック操作演算子を提供します。一般的に提供されるのは、dup (スタックの一番上にある要素を複製する)、exch (または swap)、スタックの一番上にある要素を交換する (1 番目が 2 番目になり、2 番目が 1 番目になる)、roll (循環的に並べ替える) です。スタック内またはスタックの一部の要素、ポップ (またはドロップ)、スタックの一番上にある要素を破棄する (プッシュは暗黙的) などです。これらは、手順を学習する上で重要になります。

于 2009-02-08T07:43:08.987 に答える