スタックの順序を検出する方法は?


8

整数のシーケンスを 1、順番に1つずつスタックにプッシュします。各プッシュの間に、スタックから任意の数のアイテムをポップすることを選択できます(0から現在のスタックサイズまで)。

スタックから値をポップするたびに、それを出力します。

例えば、 12するとプリントアウトされますpush, pop, push, pop, push, pop21から来ていpush, push, push, pop, pop, popます。

しかしながら、 12 することができないため、可能なプリントアウトではありません 印刷された後に 1、見ずに 2 間に。

質問:次のような不可能な注文をどのように検出できますか?12

実際、私の観察に基づいて、私は潜在的な解決策を見つけました。しかし問題は私が私の観察が完全であることを証明できないことです。

私が次のロジックで書いたプログラム:

現在の値から次の値を差し引いた値が1より大きい場合、現在と次の間の値は次の後に表示できません。たとえば、current = 3およびnext = 1の場合、current(3)とnext(1)の間の値は2であり、next(1)の後には表示されないため、12 ルールに違反しています。

これはすべてのケースをカバーしますか?


回答:


6

私はあなたのアプローチを正確に理解できませんでした(それは正しいようです)、不可能な注文には単純なルールがあります:注文は不可能です ff 有る aajak そのような a>ak>aj そして <j<k。そんなにaajak 私たちは悪いトリプルと言います。

どうして?最初に、悪いトリプルがある場合、シーケンスは不可能であることを証明する必要がありますが、これは簡単なので、演習のままにしておきます(すべての前に小さいポップを除いて、中央の数字は大きいより早くポップできませんでした)。

次に、すべての不可能な順序に少なくとも1つの不良トリプルがあることを証明する必要があります。不良トリプルのないシーケンスがあるとすると、プッシュとポップの順序を見つけることができるため、不可能なシーケンスではありません。プッシュ注文とポップ注文を再構築するには、単純なアプローチを使用するだけです(連続する数値を反復する間、操作はポップです)が、正式な証明(簡単にするため)には、帰納法を使用できます。メートル悪いトリプルがなければ、不可能ではありません。長さのシーケンスについて、操作をポップ(シーケンスの最後から開始)として設定できます。連続番号の増加に遭遇している間、シーケンスの長さが決まります。 メートルメートル<、不良トリプルがないため、このシーケンスのプッシュとポップを再構築できるため、元のシーケンスは不可能ではありませんでした。誘導の開始は長さ3のシーケンスです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.