面试题9:用两个栈实现队列

package com.offer;

import java.util.Stack;

/**
 * @authore Xavier
 * @description 用两个栈实现一个队列
 * 实现队列中的两个函数:
 * appendTail: 在队尾插入节点
 * deleteHead: 队列头删除节点
 * @date 2018/7/20
 */
public class CQueue<E> {

    /**
     * 两个stack
     */
    private Stack<E> stack1 = new Stack<>();

    private Stack<E> stack2 = new Stack<>();

    /**
     * 思路: stack1负责压入; stack2负责删除;
     * 统一压入stack1可保证一直在尾部;
     * 删除的话,如果stack2为空,则所有的stack1元素都pop并push到stack2中,这样保证了stack2中元素顺序与压入时相同,即先进先出;
     * 如果stack2不会空,则直接pop;因为stack2中元素的顺序肯定先于stack1中;
     *
     * @param e
     */
    public void appendTail(E e) {
        stack1.push(e);
    }

    public E deleteHead() {
        if (stack2.size() <= 0) {
            while (stack1.size() > 0) {
                stack2.push(stack1.pop());
            }
        }
        if (stack2.size() == 0) {
            throw new RuntimeException("queue is empty");
        }
        return stack2.pop();
    }

    public static void main(String[] args) {
        CQueue<Integer> cQueue = new CQueue<>();
        cQueue.appendTail(1);
        cQueue.appendTail(2);
        System.out.println(cQueue.deleteHead());
    }

}


猜你喜欢

转载自blog.csdn.net/huaixiaozi90/article/details/81136683