長い話、私の講師はがらくたであり、オーバーヘッドプロジェクターを介してスタックのプレフィックスを挿入するための挿入記号を見せていました。彼の大きな影がすべてをブロックしていたので、重要なものを見逃しました
彼はプッシュとポップを指していた、プッシュ= 0ポップ= x
彼は例を挙げましたが、どうやって彼が答えを得るかわかりません。
2*3/(2-1)+5*(4-1)
ステップ1リバース:)1-4(*5+)1-2(/3*2
わかりました
彼はそれからxとoの操作を書き続け、私は完全に迷子になりました
回答14-5*12-32*/+
その後再び逆になって+/*23-21*5-41
誰かが私にプッシュポップを説明して私が非常に素晴らしいことを理解できるなら、私はオンラインで見ましたが、私が見つけた多くのものはこの上のステップのようですので、まずここで理解する必要があります
うまくいけば、これがスタックとその仕組みを視覚化するのに役立つでしょう。
空のスタック:
| |
| |
| |
-------
A
をプッシュすると、次の結果が得られます。
| |
| |
| A |
-------
B
をプッシュすると、次の結果が得られます。
| |
| B |
| A |
-------
ポップした後、次のものが得られます。
| |
| |
| A |
-------
C
をプッシュすると、次の結果が得られます。
| |
| C |
| A |
-------
ポップした後、次のものが得られます。
| |
| |
| A |
-------
ポップした後、次のものが得られます。
| |
| |
| |
-------
Oren Aによって投稿されたライフルクリップの類推はかなり良いですが、私は別の1つを試して、インストラクターが伝えようとしているものを予測しようとします。
スタックは、その名前が示すとおり、次のものを持つ「モノ」の配置です。
(机の上に書かれた本の文字通りのスタックと考えてください。上からしか取り出せません)
スタックに何かをプッシュするということは、「一番上に置く」ことを意味します。スタックから何かをポップするとは、スタックから「一番上の「もの」を取り出す」ことを意味します。
簡単な使用法は、単語の順序を逆にすることです。 「ポップコーン」という言葉を逆にします。各文字を左から右(7文字すべて)にプッシュし、7文字をポップすると、逆の順序で表示されます。これは彼がそれらの表現でやっていたことのように見えます。
プッシュ(p)プッシュ(o)プッシュ(p)プッシュ(c)プッシュ(o)プッシュ(r)プッシュ(n)
word全体をプッシュすると、スタックは次のようになります。
| n | <- top
| r |
| o |
| c |
| p |
| o |
| p | <- bottom (first "thing" pushed on an empty stack)
======
7回pop()すると、次の順序で文字が取得されます。
n、r、o、c、p、o、p
infix/postfix/prefixの変換は、スタックを教えるときのコンピューターサイエンスの病理学的例です。
中置式への修正後の変換は非常に簡単です。
(式を左から右にスキャンします)
したがって、53 + 2 *がある場合、次の手順でそれを中置に変換できます。
*式の最後に到達したときに、式が正しく形成された場合、スタックには1つのアイテムのみが含まれます。
「x」および「o」を導入することにより、彼はそれらを挿入表現の左および右オペランドの一時的なホルダーとして使用している可能性があります:x + o、x-oなど(またはx、oの順序が逆)。
ニースもあります wikipediaに書いてください もあります。表現の順序を間違えた場合に備えて、回答をウィキとして残しました。
インフィックスからプレフィックス式に進むアルゴリズムは次のとおりです。
-reverse input
TOS = top of stack
If next symbol is:
- an operand -> output it
- an operator ->
while TOS is an operator of higher priority -> pop and output TOS
Push symbol
- a closing parenthesis -> Push it
- an opening parenthesis -> pop and output TOS until TOS is matching
parenthesis, then pop and discard TOS.
-reverse output
あなたの例は次のようになります(x Push、o POP):
2*3/(2-1)+5*(4-1)
)1-4(*5+)1-2(/3*2
Next
Symbol Stack Output
) x )
1 ) 1
- x )- 1
4 )- 14
( o ) 14-
o 14-
* x * 14-
5 * 14-5
+ o 14-5*
x + 14-5*
) x +) 14-5*
1 +) 14-5*1
- x +)- 14-5*1
2 +)- 14-5*12
( o +) 14-5*12-
o + 14-5*12-
/ x +/ 14-5*12-
3 +/ 14-5*12-3
* x +/* 14-5*12-3
2 +/* 14-5*12-32
o +/ 14-5*12-32*
o + 14-5*12-32*/
o 14-5*12-32*/+
+/*23-21*5-41
スタックはLIFO(Last In First Out)データ構造です。プッシュとポップの操作は簡単です。プッシュはスタックに何かを置き、ポップは何かを取り去ります。 LIFO順序を保持するために、上部を脱ぎます。
編集-FIFOからLIFOに修正。 Facepalm!
説明のために、空のスタックから始めます
|
次に「x」を押します
| 'バツ'
その後、「y」を押します
| 「x」「y」
その後、ポップ
| 'バツ'
OK。他の回答者が説明したように、スタックは後入れ先出しのデータ構造です。プッシュ操作でスタックの一番上に要素を追加します。 Pop操作で要素を上から外します。要素は、挿入された順序と逆の順序で削除されます(したがって、最後に入力、最初に出力)。たとえば、要素1、2、3をこの順序でプッシュすると、番号3がスタックの一番上になります。 Pop操作はそれを削除し(最後の入力でした)、スタックの最上部に2を残します。
講義の残りの部分について、講師は算術式を評価するスタックベースのマシンを説明しようとしました。マシンは、スタックの上部から3つの要素を連続してポップすることにより動作します。最初の2つの要素はオペランドで、3番目の要素は演算子(+、-、*、/)です。次に、この演算子をオペランドに適用し、結果をスタックにプッシュします。このプロセスは、スタック上に式の値である要素が1つだけになるまで続きます。
したがって、左から右の順に値「+/* 23-21 * 5-41」をスタックにプッシュすることから始めたと仮定します。次に、上から3つの要素をポップします。最後の入力は最初の出力です。つまり、最初の3つの要素は「1」、「4」、「-」の順になります。スタックに数3(4-1の結果)をプッシュし、3つの最上位要素3、5、*をポップします。結果15をスタックにプッシュします。
原則としてスタックは非常に簡単です。ライフルのクリップを想像してください-一番上の弾丸にしかアクセスできません-それを取り出すことは「ポップ」と呼ばれ、新しいものを挿入することは「プッシュ」と呼ばれます。
非常に便利な例は、「元に戻す」ことができるアプリケーションです。
アプリケーションの各状態をスタックに保存するとします。例えばユーザーが作成するすべてのタイプの後のアプリケーションの状態。
ユーザーが「元に戻す」を押すと、スタックから前の状態を「ポップ」します。ユーザーが行うすべてのアクションに対して、新しい状態をスタックに「プッシュ」します(もちろん単純化されます)。
講師が具体的に行っていたことについて-それを説明するには、さらに情報が役立つと思います。
単に:
pop:一番上のアイテムを返し、スタックから削除します
プッシュ:スタックの一番上にアイテムを追加します。
これらすべての良い例の後、アダム・シャンクマンはまだそれを理解できません。いくつかのコードを開いて試してみるべきだと思います。 2番目にmyStack.Push(1)とmyStack.Pop(1)を試してみると、実際に画像が表示されます。しかし、その見た目では、それでもあなたにとって挑戦になります!