2つのスタック実装キュー、2つのキュー実装スタック---Java


2つのスタック実装キュー
2つのスタック、1つのpushスタック、1つのpopスタックを採用して、毎回pushの時に直接pushスタックに入って、毎回popの時、popスタックの中から弾き出すだけで、popスタックがnullの時、pushスタックの中のすべての要素をpopスタックの中に押して、このように要素の追加の順序を還元して、先に出て、注意して、popスタックがnullの時だけスタックを押すことができて、乱序でなければ、先進的な先出の目的を達成することはできない.例:
pushスタックに1,2,3,4,5を追加します.
pop操作が必要になると、popスタックがnullであることを保証する場合、popスタックのすべての要素をpopスタックにポップアップし、ポップアップ順序が5,4,3,2,1であると、popスタックの要素の追加順序も5,4,3,2,1であり、その後、スタックトップ要素1を直接ポップアップし、先進的な先出に合致する.
class TwoStackQueue {
    private Stack pushStack;
    private Stack popStack;
    TwoStackQueue() {
        pushStack = new Stack<>();
        popStack = new Stack<>();
    }

    public void push(int num) {
        pushStack.push(num);
    }

    public int pop() {
        if (pushStack.isEmpty() && popStack.isEmpty()) {
            throw new RuntimeException("Queue is empty!");
        }
//          popStack  ,    pushStack         popStack
        if (popStack.isEmpty()) {
            while ( !pushStack.isEmpty() ) {
                popStack.push(pushStack.pop());
            }
        }
//          popStack     
        return popStack.pop();
    }
    public int peek(){
        if (pushStack.isEmpty() && popStack.isEmpty()) {
            throw new RuntimeException("Queue is empty!");
        }
        if (popStack.isEmpty()) {
            while ( !pushStack.isEmpty() ) {
                popStack.push(pushStack.pop());
            }
        }
        return popStack.peek();
    }
}

2つのキュー実装スタック
2つのスタック、1つのqueue、1つのhelpを採用して、pushのたびに直接queueキューに入って、popの時、直接queueの中の要素poll()を1つの要素しか残っていないまで、残りの1つの要素poll()を落として、残りの要素はすべてhelpキューにaddして、注意して、毎回popあるいはpeekの後で2つのキューのインデックスを交換しなければなりません.例:
push了1,2,3,4,5到queue Pop操作:キューqueueが順次ポップアップされてhelpキューに追加され、1,2,3,4現在help要素は1,2,3,4であり、次にqueueに残っている唯一の要素5がポップアップされ、後進先出に合致する.
swap()はqueueとhelpインデックスを交換し、新しい要素が追加され続けるようにします.
class TwoQueueStack {
    private Queue queue;
    private Queue help;
    TwoQueueStack(){
        queue = new LinkedList<>();
        help = new LinkedList<>();
    }
    public void push(int num) {
        queue.add(num);
    }
    public int pop(){
        if (queue.isEmpty()) {
            throw new RuntimeException("Stack is empty!");
        }
        while ( queue.size() > 1 ) {
            help.add(queue.poll());
        }
        int res = queue.poll();
        swap();
        return res;
    }
    public int peek(){
        if (queue.isEmpty()) {
            throw new RuntimeException("Stack is empty!");
        }
        while ( queue.size() > 1 ) {
            help.add(queue.poll());
        }
        int res = queue.poll();
        help.add(res);
        swap();
        return res;
    }
    private void swap() {
        Queue tmp = help;
        help = queue;
        queue = tmp;
    }
}