タイトル:整数の2つの入力配列、圧入のスタックのシーケンスを表す第1の配列が、第二の配列は、ポップ・アップ・シーケンススタックの要求か否かを判断します。スタックが等しいと仮定されている上に全ての数字は、押されていません。そのような配列として1,2,3,4,5配列は、プッシュ・シーケンスがポップの配列に対応するスタックプッシュ配列、4,5,3,2,1であるが、4,3,5,1図2は、プッシュ・シーケンスのポップアップシーケンスすることはできません。
この問題を解決するためのアイデアは非常に直感的な補助スタックを作成することで、今度は第一の配列のデジタル入力は、補助スタックにプッシュされ、ひいては第二の配列の順にスタックから数値をポップ。ポップシーケンス4,5,3,2,1例を押すとポップする分析方法。最初の数は4,4吐出さしたがって補助スタックの内部に圧入する必要があることが望まれます。順次圧入スタック4には、1,2,3デジタル必要がスタックの内部に押し込まれる前に、ある決定されたプッシュ・シーケンスによってスタックにプッシュ。このとき、それぞれ4つの数字、1,2,3,4、スタックの4つの上部を含むスタック。4後にスタックをポップし、残りの3つの数字は、我々は次のポップアップ数であるように1、2希望されている、我々は最初のシーケンスパキスタンの後に行ってきましたので、それは、スタック数のトップではないので、5である4この時スタック5の上面は、それがポップアップすることができるデジタル5に押し込まれるまで、デジタル補助スタックに押し込みます。次はあなたが直接ポップアップ表示できるように、各操作の前に、彼らは、スタックの最上位であるため、3,2,1に続いて3つの数字をポップさせたいです。
上記スタック、プロセスのスタックを要約すると、我々は、裁判官は、ポップアップシーケンス順序のスタックではない法律を見つけることができます。次のポップアップ数値スタックはちょうど数である場合は、直接ポップアップ表示します。次のポップアップ番号がスタック外の場合、我々は、シーケンスは、次のポップアップ数字は、スタックを押し上げ知っているデジタル補助スタックニーズのスタックにプッシュされていないプッシュします。すべての数字はまだ次のポップアップ番号を見つけることができませんでしたスタックにプッシュされている場合は、シーケンスは、ポップアップシーケンスすることはできません。
public boolean IsPopOrder(int [] pushA,int [] popA) {
if(pushA == null || popA == null){
return false;
}
int m = pushA.length;
int n = popA.length;
if(m == 0 || n == 0){
return false;
}
Stack<Integer> s = new Stack<Integer>();
int start = 0;
for(int i = 0; i < n; i++){
while(s.empty() || s.peek() != popA[i]){
if(start == m){
break;
}
s.push(pushA[start++]);
}
if(s.peek() != popA[i]){
return false;
}
s.pop();
}
return true;
}