-
トピック:
整数の2つの入力配列、押圧スタック順序を表す第1の配列は、それが第二の配列のポップアップスタックの順序が可能であるか否かを判断します。
例えば:数字のすべてがスタックにプッシュ等しくないと仮定します。1,2,3,4,5の配列の配列がスタックに押し込まれるような、プッシュ・シーケンスは、ポップアップに対応4,5,3,2,1配列です。
4,3,5,1,2シーケンスのポップアップ・シーケンスをプッシュすることは不可能です。(注:2つのシーケンスの長さが等しいです)
-
問題解決のアイデア:
第一の位置に関連するPOPA比較[]の数のそれぞれに一時的スタック、スタック圧力への入力シーケンスPUSHA []データを順次、ビルド
YESの場合、ポップアップ、次いで圧入をし続け、そして[] POPA位置と第二コンパ、同じ、ポップアップ、低級圧入POPA番号[]比較の3番目の位置の数、もし
最後に、暫定番号スタックがポップアップことができれば、順次、進行、その後、POPA []はPUSHA []は比較的空のテキストに記載ポップアップ配列の、以下のリストは、各ステップの結果を詳述しています。
ポップアップシーケンスインデックスint型popIndex = 0;;スタックスタック<整数> TEMP =新しいスタック<整数>()付き
PUSH [] = {1,2,3,4,5}; POPA [] = {4,5,3,2,1}。
(1)[popIndex比較POPA、1に圧入!= 4;押され続け、吐出されません。
(2)2に圧入され、及びPOPA [popIndex比較、2!= 4; 押され続け、吐出されません。
(3)3 に圧入[popIndex比較POPA、3!= 4; 押され続け、吐出されません。
(4)4が押され、そしてPOPA [popIndex比較、4 == 4; 4ポップ、シフト後popIndex、popIndex = popIndex + 1 = 1 。
5(5) 、押下[popIndex]比較POPA、5 == 5、シフトpopIndex後5ポップ、popIndex popIndex + = = 2 1; // 5の数をスタックに順次
(6)図5は、頂部要素3をポップ、3 及びPOPA [popIndex比較、3 == 3; 3、シフトpopIndex後、popIndex = popIndex + 1 = 3をポップ 。
(7)3の後上部要素2ポップ、2 及びPOPA [popIndex比較、2 == 2; 2、シフトpopIndex後、popIndex = popIndex + 1 = 4をポップ 。
(8)2トップ素子1をポップ1は、POPA [popIndex]、1 == 1とを比較し 、1 ポップ、シフトpopIndex後、popIndex = popIndex + 1 = 5 。
これまでのところ、すべての要素がスタックの一時的なポップされ、スタックが空である、それは蛹は、[]ポップアップシーケンスのポッパ[]であることを意味します。
もしPOPAは[] = {4,5,3,1,2};場合:
(1)[popIndex比較POPA、1に圧入!= 4;押され続け、吐出されません。
(2)2に圧入され、及びPOPA [popIndex比較、2!= 4; 押され続け、吐出されません。
(3)3 に圧入[popIndex比較POPA、3!= 4; 押され続け、吐出されません。
(4)4が押され、そしてPOPA [popIndex比較、4 == 4; 4ポップ、シフト後popIndex、popIndex = popIndex + 1 = 1 。
5(5) 、押下[popIndex]比較POPA、5 == 5、シフトpopIndex後5ポップ、popIndex popIndex + = = 2 1; // 5の数をスタックに順次
(6)図5は、頂部要素3をポップ、3 及びPOPA [popIndex比較、3 == 3; 3、シフトpopIndex後、popIndex = popIndex + 1 = 3をポップ 。
(7)図3は、上部要素2ポップ、2 及びPOPAは[popIndex] = 1 ;! 2 2は、比較排出されず、スタックは状態データにされているように、2を、排出されていない、POPA []ないPUSHA []ポップアップシーケンスの。
-
コードの実装(Javaの):
/ ** * * / パッケージcom.cherish.SwordRefersToOffer; インポートjava.util.Stackを; / ** * @author エイサー *タイトル: *整数の2つの入力シーケンス、圧入のスタックの順序を表す第1のシーケンス、してください決意ポップ・スタックのシーケンス順序のための第二の可能性。 *すべての数値は同じスタックにプッシュされていないと仮定します。1,2,3,4,5の配列の配列がスタックに押し込まれるような、プッシュシーケンスがポップの配列に対応する配列で4,5,3,2,1 、*が、4,3,5,1図2は、プッシュ・シーケンスのポップアップシーケンスすることはできません。(二つの等しい長配列注) * * * / パブリック クラスtest_31_プッシュとスタックポップシーケンス{ / ** * @paramの引数を * / パブリック 静的 ボイド{メイン(文字列[]引数) / / 自動的に生成されたスタブのTODO方法は、 int型 [] = {1,2,3,4,5 PUSHA}; のInt [] = {4,5,3,2,1 POPA }; のSystem.out.println(IsPopOrder(PUSHA、POPAが)); } パブリック 静的 ブール IsPopOrder(int型、[] PUSHAをint型[] POPA)を{ IF(pushA.length == 0 || popA.length == 0 ) { リターン falseに; } スタック <整数> TEMP = 新しい新しいスタック<整数> (); // ポップアップ配列の位置特定のために INTを popIndex = 0 。 以下のために(int型 0 = Iを、I <pushA.length; I ++を) { Temp.push(PUSHA [I]); // スタックが空でない場合、先頭の要素と等しいポップアップ配列 ながら(Temp.empty()&& temp.peek()==!POPA [popIndex]) { // アウトスタック temp.pop(); // ポップアップシーケンスバック popIndex ++ ; } } 戻りtemp.empty(); } }
結果:
-
コードの実装(C#の):
使用して、システムを 使用して; System.Collections.Genericを 使用してSystem.Linqのを、 名前空間test_31_プッシュとスタック配列ポップ { クラスプログラム { 静的 ボイドメイン(文字列[]引数) { INT [] = {pushV 。1、2、3、4、5 }; int型 [] = {POPV 4。 、5、3、2、1 }; Console.WriteLineを(IsPopOrder(pushV、POPV))。 Console.ReadLine(); } )パブリック 静的 ブール IsPopOrder(INT [] pushV、INT [] POPV) { // ここで、書き込みコード 場合(pushV.Lengthの== 0 || popV.Lengthが== 0 ) { 戻り 偽。 } VARのスタック= 新しいスタック< 整数 > (); int型 popIndex = 0 ; 以下のために(int型 i = 0 ; I <pushV.Length; I ++ { stack.Push(pushV [I])。 ながら(stack.Count> 0 && stack.Peekは()に等しい(POPV [popIndex])) { Stack.Pop(); // 先頭の要素をポップ popIndex ++; // シフトインデックス後POPV } } 戻り stack.Count()== 0 ; } } }
結果を実現: