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

题目描述:用两个栈实现一个队列。分别完成在队列尾部插入结点和在队列头部删除结点的功能。

基本知识:

(1)队列的操作:
    offer:队尾插入元素,插入失败返回false。
    poll:队头取出元素
   LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。

(2)实现栈的操作:
    push:向栈中压入元素。
    pop:从栈顶弹出元素。

主要思路:

经过两个栈之后,就是一个队列。插入元素在栈1中,当栈2为空时,就从栈1中依次取出全部的元素压入栈2,取元素是从栈2中取。
public class MyQueue<T> {
    private Stack<T> stack1;
    private Stack<T> stack2;
    public MyQueue(){//泛型的构造函数原来和普通类一样?
        stack1=new Stack<T>();
        stack2=new Stack<T>();
    }
    //队尾插入
    public void add(T item) {
        stack1.push(item);
    }
    //队头删除
    public T delete() {
        if(stack2.isEmpty()){//当栈2为空时,就从栈1中依次取出全部数据压入栈2中
            while(!stack1.isEmpty()){
                stack2.push(stack1.pop());
            }
        }
        if(!stack2.isEmpty())
            return stack2.pop();
        else
            return null;
    }
}

扩展:用两个队列实现一个栈

主要思路:

新push进来的元素总是插入到非空队列中,空队列则用来保存较老的元素,较新的元素则弹出,每pop一次产生一个空队列。

代码:

public class MyStack<T> {
    private Queue<T> queue1;
    private Queue<T> queue2;
    public MyStack(){
        queue1=new LinkedList<T>();
        queue2=new LinkedList<T>();
    }
    //向栈中压入元素。因为两个队列至少有一个是空的,要将元素插入非空队列中。
    public void push(T item){ 
        if(!queue2.isEmpty())
            queue2.offer(item);
        else
            queue1.offer(item);
    }

    // 弹出栈顶元素,因为要弹出最新的那个,所以返回的是最后插入的那个元素,且每一次pop都会将一个队列变空。
    public T pop() {
        if (!queue1.isEmpty()) {
            while (queue1.size() > 1) {
                queue2.offer(queue1.poll());
            }
            return queue1.poll();
        }
        if (!queue2.isEmpty()) {
            while (queue2.size() > 1) {
                queue1.offer(queue2.poll());
            }
            return queue2.poll();
        }
        return null;
    }
}

猜你喜欢

转载自blog.csdn.net/jingshuiliushen_zj/article/details/81778913