java Java栈实现队列,队列实现栈

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java Java栈实现队列,队列实现栈相关的知识,希望对你有一定的参考价值。

package com.github.congyh.algorithm;


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

public class StackQueue {

    /**
     * 双栈实现队列
     *
     * @param <E>
     */
    public static class MyQueue<E> {
        private Stack<E> stack1 = new Stack<>();
        private Stack<E> stack2 = new Stack<>();

        public boolean offer(E elem) {
            stack1.push(elem);
            return true;
        }

        public E peek() {
            if (isEmpty()) {
                throw new NoSuchElementException();
            } else {
                if (stack2.isEmpty()) {
                    while(!stack1.isEmpty()) {
                        stack2.push(stack1.pop());
                    }
                }

                return stack2.peek();
            }
        }

        public E poll() {
            peek();
            return stack2.pop();
        }

        public boolean isEmpty() {
            return stack1.isEmpty() && stack2.isEmpty();
        }
    }

    /**
     * 双队列实现栈
     *
     * 注意: 无论是实现队列还是栈, 都需要至少实现四个方法.
     *
     * @param <E>
     */
    public static class MyStack<E> {
        // 注意: 与双栈实现队列不同的是, 这里两个队列的关系是对等的.
        private Queue<E> queue1 = new LinkedList<>();
        private Queue<E> queue2 = new LinkedList<>();

        public void push(E e) {
            if (queue2.isEmpty()) {
                queue1.offer(e);
            } else { // 只有queue2不为空的情况下才加入到queue2中. 两者同时为空的时候加入到queue1中
                queue2.offer(e);
            }
        }

        public E peek() {
            E ret = null;
            if (queue1.isEmpty() && !queue2.isEmpty()) {
                while (!queue2.isEmpty()) {
                    ret = queue2.poll();
                    queue1.offer(ret);
                }
            } else if (!queue1.isEmpty() && queue2.isEmpty()) {
                while (!queue1.isEmpty()) {
                    ret = queue1.poll();
                    queue2.offer(ret);
                }
            }

            return ret;
        }

        public E pop() {
            E ret = null;
            if (queue1.isEmpty() && !queue2.isEmpty()) {
                while (!queue2.isEmpty()) {
                    ret = queue2.poll();
                    // 与peek方法的唯一区别就是, 这里最后一个元素直接弹出不入队.
                    if (!queue2.isEmpty()) {
                        queue1.offer(ret);
                    }
                }
            } else if (!queue1.isEmpty() && queue2.isEmpty()) {
                while (!queue1.isEmpty()) {
                    ret = queue1.poll();
                    if (!queue1.isEmpty()) {
                        queue2.offer(ret);
                    }
                }
            }

            return ret;
        }

        public boolean isEmpty() {
            return queue1.isEmpty() && queue2.isEmpty();
        }
    }
}

以上是关于java Java栈实现队列,队列实现栈的主要内容,如果未能解决你的问题,请参考以下文章

Java之用栈实现队列

数据结构 Java 版详解栈和队列的实现

数据结构 Java 版详解栈和队列的实现

用两个栈实现队列Java实现[剑指offer]

Java:基于LinkedList实现栈和队列

LeetCode Java刷题笔记—232. 用栈实现队列