2016-10-28 9 views
1

スタックをポップしてポップと比較することでスタックがソートされているかどうかチェックしています。ポップがピークよりも大きい場合は、その2つの要素が順番になっていることがわかります。スタックが空でない限り、このループを実行します。空のスタックではじめるのをやめてください。

私が取り組んでいる問題は、スタックの最終要素です。私は最終的なポップを行いますが、空のスタックを覗き見て、順番どおりになるようにします。そこには何もないので、私はランタイムエラーが発生します。

public static boolean isSorted(Stack<Integer> s){ 
boolean result = true; 

while(!s.empty()){ 
    if(s.pop() < s.peek()){ 
     result = false; 
    } 
} 

return result; 
} 

は、私はとてもポップでのぞき見を押すだけ使用して、この独占的にスタックしてやろうとしています。 ArrayListからのものはありません。すべての要素をチェックしながら、この問題を解決するにはどうすればよいですか?

一時変数にpopを格納しようとしましたが、何も修正されませんでした。私が望んでいたことを確信していません

答えて

2

問題は2つのアイテムが必要ですが、empty()は1つのアイテムだけをチェックすることです。あなたがpop()を呼び出したら、実行前に別のempty()の呼び出しを行う必要がありpeek():それはあり

while(!s.empty()){ 
    // We know we have one element available; store it in "top" 
    Integer top = s.pop(); 
    // If the next element is not available, exit 
    if (s.empty()) { 
     break; 
    } 
    if(top < s.peek()){ 
     // Once result is set to "false", it never becomes "true" 
     // so we might as well return now: 
     return false; 
    } 
} 
return true; 
+0

私は実際に何かを試しましたgも同様ですが、まだエラーがあります。私は別のショットを与え、それがどのように進むのかを教えてあげます。 – Podo

+0

あなたはスタックに固執するだけでなく、確かな説明を与えてくれるので、私はこれを正しい答えとして選んでいます。ありがとうございました! – Podo

+0

私は元のスタックを変更したくないということを含めるべきでした。あなたの解決策はそれを行いますが、それが問題ではないことが要求されていれば、問題はありません。ループのどこで値をセカンダリスタックにプッシュしますか? – Podo

0

に、popは最後の要素を取り除き、スタックが空の場合peekEmptyStackExceptionスローとして

public static boolean isSorted(Stack<Integer> s){ 
boolean result = true; 
while(!s.empty()){ 
    if(s.size() == 1) 
     return result; 
    if(s.pop() < s.peek()){ 
     result = false; 
    } 
} 

return result; 
} 
+0

意味があります.... –

+2

'if(s.pop()

+0

@ Shady Atef、s.sizeを使用します。これはArrayListから継承されたメソッドです。私はスタックに行く – Podo

0

これを行う方法の1つは、サイズを明示的に確認することです。

while(s.size() > 1){ // ok, we have enough elements in the stack 
    if (s.pop() < s.peek()) { 
     result = false; 
     break; // no need to proceed, we already know it's not sorted. 
    } 
}