leetcode刷题笔记——用栈实现队列(easy)

使用栈实现队列的下列操作:

push(x) -- 将一个元素放入队列的尾部。
pop() -- 从队列首部移除元素。
peek() -- 返回队列首部的元素。
empty() -- 返回队列是否为空。

示例:

MyQueue queue = new MyQueue();

queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false

说明:

你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。

先明确哈,栈先进后出,队列先进先出
很容易能想到用两个栈来实现这个功能,一个元素需要经过两个栈才能出队列,在经过第一个栈时元素顺序被反转,经过第二个栈时再次被发展,此时就是先进先出顺序。
我自己写的题解和csnote上的题解有点差别,主要是在push这个内容上,简单来说就是我的方法比较笨,人家就很机灵了。但是最终的用时和空间还是差不多的
先说我自己的做法

public class MyQueue {
    private Stack<Integer> in =new Stack();
    private Stack<Integer> out =new Stack();

    public MyQueue(Stack<Integer> in, Stack<Integer> out) {
        this.in = in;
        this.out = out;
    }
    public void push(int x){//每次push都要保证out栈里是空的
        if(!out.empty()) {
            while (!out.empty()) {
                in.push(out.pop());
            }
        }
        in.push(x);
    }
    public int pop(){
        while (!in.empty()){
            out.push(in.pop());
        }
        int b=out.pop();
        return b;
    }
    public int peek(){//返回队首
        while (!in.empty()){
            out.push(in.pop());
        }
        int b=out.pop();
        out.push(b);
        return b;

    }
    public boolean empty(){
        if (in.empty()&&out.empty()){
            return true;
        }
        return false;
    }
}

csNote的题解

class MyQueue {

    private Stack<Integer> in = new Stack<>();
    private Stack<Integer> out = new Stack<>();

    public void push(int x) {
        in.push(x);
    }

    public int pop() {
        in2out();
        return out.pop();
    }

    public int peek() {
        in2out();
        return out.peek();
    }

    private void in2out() {  //和我的主要区别就是这个方法,把调整单独写成了个方法,调整的方法与我的方法也有区别,举个例子就很容易看懂
        if (out.isEmpty()) {
            while (!in.isEmpty()) {
                out.push(in.pop());
            }
        }
    }

    public boolean empty() {
        return in.isEmpty() && out.isEmpty();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值