代码随想录一刷(day10) |232.用栈实现队列|225. 用队列实现栈|

232.用栈实现队列

思考

  • 栈的特点: 先进后出
  • 队列的特点: 先进先出

我们可以使用两个栈来模拟队列,一个为入栈一个为出栈,将一堆元素放入入栈中,再将其从入栈中pop出来,push到出栈中,此时从出栈中pop出的元素顺序,即为元素刚开始进入入栈的顺序【可以理解为负负得正】,值得注意的是,在pop(),peek()前要先确定出栈是不是空的,如果不是空的,先pop()出栈里面存的元素。如果是空的将入栈的元素放入到出栈中,之后再进行pop()。总之,防止在出栈中还有元素的情况下向出栈里加入元素

代码展示

class MyQueue {
    Stack<Integer> stackIn;
    Stack<Integer> stackOut;
    public MyQueue() {
        stackIn = new Stack<>();
        stackOut = new Stack<>();
    }

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

    public int pop() {
        protect();
        Integer pop = stackOut.pop();
        return pop;
    }

    public int peek() {
        protect();
        Integer pop = stackOut.pop();
        stackOut.push(pop);
        return pop;
    }

    public boolean empty() {
        return stackOut.isEmpty()&&stackIn.isEmpty();
    }
    public void protect(){
        if (!stackOut.isEmpty()) return;
        while (!stackIn.isEmpty()){
            Integer pop = stackIn.pop();
            stackOut.push(pop);
        }
    }
}

 总结

由于栈是先进后出,而队列是先进先出,属于需要使用两个栈才能模拟队列先进先出的情况。

225. 用队列实现栈

思考

队列的特点是先进先出,因此使用一个对列,在pop()前先将最后一个元素之前的元素从队列中取出,再将它们依次放入队列就可以使得随后的元素出现在队列头部,而剩余的元素则按照原来的顺序排在他们后面【即 123456 -> 612345】,每次pop()元素时都按照这样操作即可模拟栈的pop()。然而在模拟队列的top()操作时,则不能这样操作,因为top()只返回栈顶元素而不删除,如果按照top()时的操作就会打乱队列中存放元素的顺序,这里使用ArrayDeque类的getLast()方法返回

//一个队列实现
class MyStack {
    public static void main(String[] args) {
        MyStack myStack = new MyStack();
        myStack.push(1);
        myStack.push(2);
        myStack.push(3);
        System.out.println(myStack);
        System.out.println(myStack.pop());
        System.out.println(myStack.pop());
        System.out.println(myStack.pop());

    }

    ArrayDeque<Integer> queue = new ArrayDeque<>();

    public MyStack() {

    }

    public void push(int x) {
        queue.add(x);
    }

    public int pop() {
        reserve();
        Integer poll = queue.poll();
        return poll;
    }

    public int top() {
        Integer element = queue.getLast();
        return element;
    }

    public boolean empty() {
        return queue.isEmpty();
    }

    public void reserve(){
        int size = queue.size();
        //反转队列
        while (size > 1){
            //将队列头节点的加到队列尾节点并删除头节点
            queue.add(queue.poll());
            size--;
        }
    }

    @Override
    public String toString() {
        return "MyStack{" +
                "queue=" + queue +
                '}';
    }
}

 总结

由于队列先进先出的特点,我们使用一个队列即可模拟栈的特点

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值