スタックを実現するための2つのキュー+キューを実現するための2つのスタック(Java実装)

2つのキューがスタックを実装します

  1. q1とq2の2つのキューがあり、スタックにプッシュされると要素がq1に追加されます。
  2. スタックをポップするときは、最初にq1が空かどうかを判断します。これは、q1の要素が常に最後に入力され、キューの最後の要素を除いて最後に最初に出力され、他の要素がq2に追加され、q1の最後の要素がデキューされるためです。
  3. スタックからポップするときに、q1が2で空であると判断された場合、q2の最後の要素を除いて、q2の他の要素をq1に追加すると、q2の最後の要素がデキューされます。

完全なJavaコード:

public class MyStack {
    
    

    private Queue<Integer> q1 = new LinkedList<>();
    private Queue<Integer> q2 = new LinkedList<>();

    public MyStack() {
    
    
    }

    public boolean push(Integer num) {
    
    
        return q1.offer(num);
    }

    public Integer pop() {
    
    
        if (q1.isEmpty() && q2.isEmpty()) {
    
    
            return null;
        }
        // 先判断 q1 是否为空 
        if (!q1.isEmpty()) {
    
    
            int size = q1.size();
            for (int i = 0; i < size - 1; i++) {
    
    
                q2.offer(q1.poll());
            }
            return q1.poll();
        } else {
    
    
            int size = q2.size();
            for (int i = 0; i < size - 1; i++) {
    
    
                q1.offer(q2.poll());
            }
            return q2.poll();
        }
    }

    public Integer size() {
    
    
        return q1.size() + q2.size();
    }


    public static void main(String[] args) {
    
    
        MyStack stack = new MyStack();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        stack.push(5);

        int size = stack.size();
        for (int i = 0; i < size; i++) {
    
    
            System.out.print(stack.pop() + " ");
        }
        System.out.println();
        stack.push(6);
        System.out.println(stack.pop());
    }
}

2スタック実装キュー

キューの実装に似ていますが、2つのキューの実装スタックよりもはるかに単純です。

  1. stack1とstack2の2つのスタックがあります
  2. キューに入るときにstack1に要素を追加するだけです
  3. キューを離れるときは、最初にstack2が空かどうかを判断します。stack2の要素は、ファーストイン、ファーストイン、ファーストアウトです。stack2が空でない場合は、stack2の一番上の要素を直接ポップします。空の場合は、stack1の要素をstack2に追加してから、stack2の一番上の要素をポップします。

Javaコードを見てください:

public class MyQueue {
    
    
    private Stack<Integer> stack1 = new Stack<>();
    private Stack<Integer> stack2 = new Stack<>();

    /**
     * 添加元素到队列
     *
     * @param num
     * @return
     */
    public Integer add(Integer num) {
    
    
        return stack1.push(num);
    }

    /**
     * 队列弹出元素
     *
     * @return
     */
    public Integer poll() {
    
    
        if (stack1.isEmpty() && stack2.isEmpty()) {
    
    
            return null;
        }
        // 先判断 stack2
        if (!stack2.isEmpty()) {
    
    
            return stack2.pop();
        }
        // 将 stack1 的元素放入 stack2
        int size = stack1.size();
        for (int i = 0; i < size; i++) {
    
    
            stack2.push(stack1.pop());
        }
        return stack2.pop();
    }

    public int size() {
    
    
        return stack1.size() + stack2.size();
    }


    public static void main(String[] args) {
    
    
        MyQueue queue = new MyQueue();
        queue.add(1);
        queue.add(2);
        queue.add(3);
        queue.add(4);
        queue.poll();
        queue.add(5);
        int size = queue.size();

        for (int i = 0; i < size; i++) {
    
    
            System.out.print(queue.poll() + " ");
        }
        System.out.println();
    }
}

おすすめ

転載: blog.csdn.net/jiaobuchong/article/details/88623605