2017-12-03 16 views
1

割り当てのために、スタックを使用してキューを作成する必要がありますが、このコードで何が間違っているのか分かりません。私は、プライマリ、代替、および一時的なスタックを作成しました。すべてのプッシュ、私は値を代替に追加し、現在プライマリにあるすべてが一時的にポップされることを望みます。その後、一時的に、すべての値を代替変数にポップしてから、代替変数がメインスタックになるように変数を変更します。さて、スタックに入力された複数の値をテストするためにこれを実行すると、何も出力されない無限ループが発生します。私はしばらくこのことに固執していたので、私はここで何か助けを得ることができたと思っていた。ここにコードがあります。Javaでスタックを使用してキューを作成する

Stack<Integer> mainStack = new Stack<Integer>(); 
Stack<Integer> altStack = new Stack<Integer>(); 
Stack<Integer> tmpStack = new Stack<Integer>(); 
public void push(int x) { 
    altStack.add(x); 
    while (mainStack.empty() == false){ 
     tmpStack.push(mainStack.pop()); 
    } 
    while(tmpStack.empty() == false) { 
     altStack.push(tmpStack.pop()); 
    } 

    mainStack = altStack; 
    altStack = tmpStack; 

}

public int pop() { 
    return mainStack.pop(); 
} 

public int peek() { 
    return mainStack.peek(); 
} 

public boolean empty() { 
    return mainStack.empty(); 
} 
+0

プッシュ後に古いメインスタック参照はどうなりますか?プッシュをシンプルにし、スタック転送ロジックをポップにするのも簡単です。 – vandale

答えて

0

だからあなたのアイデアは、要素の順序を逆にする別に1つのスタックからすべてをプッシュするように思われます。私はあなたがいつもポップして空になるまでそれをやるので、あなたは無限ループをどのように得るのか分かりません。しかし、あなたの考えを使ってこれを解決するには2つのキューで十分です:

Stack<Integer> mainStack = new Stack<>(); // elements pop in correct order 
// the fake queue so to speak 

public void push(int x) { 
    Stack<Integer> stack = new Stack<>(); // temporary stack 
    // reverse main stack 
    while (!mainStack.empty()) 
     stack.push(mainStack.pop()); 
    // add x first (at the bottom) of the now empty main stack 
    mainStack.push(x); 
    // add the rest of the elements to main stack (preserving original order, 
    // by reversing the elements again) 
    while (!stack.empty()) 
     mainStack.push(stack.pop()); 
} 
+0

これは問題を解決しました。ありがとう! –

関連する問題