用两个栈实现队列

题目:两个栈实现一个队列
解题思路:栈是“先进后出”,队列是“后进先出”,现有两个栈stack1、stack2,我们现在stact1 填入a、b、c三个字符,根据队列特性a应该先出栈,如果要达到效果需要借助stack2。

  1. 添加元素是往stack1
  2. 移出元素首先需要判断stack2 是否为空,不为空打印所有数据,为空则把stack1出栈添加到stack2中,然后重复2步骤。
    代码实现如下:
    static Stack stack1 = new Stack<>();
    static Stack stack2 = new Stack<>();
    public static void addStackQueue(int e) {
        stack1.push(e);
    }
    public static int deleteStackQueue() {
        if (stack2.empty()) {
            while (!stack1.empty()) {
                stack2.push(stack1.pop());
            }
        }
        if (stack2.empty()) {
             throw new EmptyStackException();
        }
        return stack2.pop();
    }

题目:两个队列实现一个栈
解题思路:队列特性“先进先出”,queue1 有a、b、c,栈“后进先出”要先得到c元素,那么借助queue2,先把queue1的a、b元素移动到queue2,输出c。当在我们输出元素后,不会出现两队列都有数据情况。根据上述特性,我们在添加元素时候,需要判断全为空选取一个队列或者找出某个不为空的队列添加数据。

    static Queue queue1 = new LinkedList<>();
    static Queue queue2 = new LinkedList<>();
    public static void addQueue(Object e) {
        if (queue1.isEmpty() && queue2.isEmpty()) {
            queue1.add(e);
        } else {
            if (!queue1.isEmpty()) {
                queue1.add(e);
            }
            else if (!queue2.isEmpty()) {
                queue2.add(e);
            }
        }
    }
    public static Object deleteQueueE() {
        if (queue2.isEmpty() && queue1.isEmpty()) {
            return null;
        }
        if (queue1.isEmpty() && !queue2.isEmpty()) {
            while (queue2.size() > 1) {
                queue1.offer(queue2.poll());
            }
            return queue2.poll();
        }
        if (!queue1.isEmpty() && queue2.isEmpty()) {
            while (queue1.size() > 1) {
                queue2.offer(queue1.poll());
            }
            return queue1.poll();
        }
        return null;
    }
 

                            
                        
                    
                    
                    

你可能感兴趣的:(用两个栈实现队列)