【知识积累】如何用队列结构实现栈结构

package com.example.demo.algorithm.D002;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

/**
 * @Description :
 * 如何用队列结构实现栈结构
 *
 * 准备两个队列
 * 队列 queue 辅助队列 help
 *
 * 当添加的时候 添加到queue中
 * 当弹出的时候 将queue的数据依次添加到help 当只有一个数据时,弹出,然后将help数组中的数据添加到queue中
 *
 * @Author : Darren
 * @Date : 2021 年 02 月 18 日 21:50:16
 * @since : 1.0
 */
public class J007_TwoQueueImplementStack {

    public static void main(String[] args) {
        System.out.println("begin");
        TwoQueueStack<Integer> twoQueueStack = new TwoQueueStack();
        Stack<Integer> stack = new Stack<>();
        int testTime = 1000000;
        int max = 1000000;
        for (int i = 0; i < testTime; i++) {
            if (twoQueueStack.isEmpty()){
                if (!stack.isEmpty()){
                    System.out.println("oops");
                }
                int value = (int) (Math.random() * max);
                twoQueueStack.push(value);
                stack.push(value);
            }else {
                if (Math.random() < 0.25){
                    int value = (int) (Math.random() * max);
                    twoQueueStack.push(value);
                    stack.push(value);
                }else if (Math.random() < 0.5){
                    if (!twoQueueStack.peek().equals(stack.peek())){
                        System.out.println("oops");
                    }
                }else if (Math.random() < 0.75){
                    if (!twoQueueStack.pop().equals(stack.pop())){
                        System.out.println("oops");
                    }
                }else{
                    if (twoQueueStack.isEmpty() != stack.isEmpty()){
                        System.out.println("oops");
                    }
                }
            }
        }
        System.out.println("end");
    }

    public static class TwoQueueStack<T>{
        private Queue<T> queue;
        private Queue<T> help;

        public TwoQueueStack() {
            this.queue = new LinkedList<>();
            this.help = new LinkedList<>();
        }

        public void push(T value){
            this.queue.add(value);
        }

        public T pop(){
            //除了最后一个元素,将其他所有的元素添加到help队列中
            while (queue.size() > 1){
                help.offer(queue.poll());
            }
            T value = queue.poll();
            //将help队列中的元素添加到queue队列中
            Queue<T> temp = queue;
            queue = help;
            help = temp;
            return value;
        }

        public T peek(){
            //除了最后一个元素,将其他所有的元素添加到help队列中
            while (queue.size() > 1){
                help.offer(queue.poll());
            }
            T value = queue.poll();
            //将要弹出的元素添加到help队列中
            help.offer(value);
            //将help队列中的元素添加到queue队列中
            Queue<T> temp = queue;
            queue = help;
            help = temp;
            return value;
        }

        public boolean isEmpty(){
            return queue.isEmpty();
        }
    }

}

 

Guess you like

Origin blog.csdn.net/axin1240101543/article/details/113846266