LeetCode第232题—用栈实现队列

本次写的题目是用栈实现队列,为LeetCode里面的题目,让我们来康康是如何解出这道题目的吧,各位尚没有思路的小伙伴可以跟随着博主的解题思路一步步来,感受一下😎

🌱分析阶段

本题与LeetCode第225题——用队列实践栈的思路大同小异。

本题题目十分清晰,就是通过利用栈来实现队列的功能。

我们都知道队列的特点是先进先出,而栈的特点却是先进后出,完全相反的两个特点。所以要想单凭一个栈是无法实现模仿的,在这里我们先用两个栈来尝试一下。这个过程自己画图做思考。 

在简单的尝试后,我们发现其是可行的。只需要创建两个栈,分别命名为stack1和stack2。其中stack1用于专门放入元素,stack2用于专门出元素。每当进元素就进入stack1,然后如果stack2是空的,就把stack1中的全部元素倒过去,此时若还要入元素,继续放入stack1,然后如果要出,若stack2中还有元素,就先不要从stack1里面倒过去,直至stack2中出元素出空了之后,若还要出,这是才从stack1里面出出来。图示如下👇:

问题思路较为清晰,到此时已经分析的较为清楚了,接下来让我们直接进入代码阶段吧😎


🌱代码阶段 

我们按照一个一个函数来进行代码编写。首先是要创建两个栈,分别命名为stack1和stack2,如下代码👇:

import java.util.*;

class MyQueue {

    public Stack<Integer> stack1 = new Stack<>();
    public Stack<Integer> stack2 = new Stack<>();

    public MyQueue() {

    }
    
    public void push(int x) {

    }
    
    public int pop() {

    }
    
    public int peek() {

    }
    
    public boolean empty() {

    }
}

🍃push函数

push函数特别简单,只需要将要放入的元素放入stack1就好。具体代码如下👇:

import java.util.*;

class MyQueue {

    public Stack<Integer> stack1 = new Stack<>();
    public Stack<Integer> stack2 = new Stack<>();

    public MyQueue() {

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

    //其他未写函数省略
}

🍃pop函数

根据前面分析:若stack2为空的时候,需要判断stack1中有没有元素,若有元素则将stack1中的所有元素倒入stack2中,然后返回并弹出stack2的栈顶元素;若stack2不为空,则返回并弹出stack2的栈顶元素。具体代码如下👇:

import java.util.*;

class MyQueue {

    public Stack<Integer> stack1 = new Stack<>();
    public Stack<Integer> stack2 = new Stack<>();

    public MyQueue() {

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

    public int pop() {
        if(stack2.empty()){ //当stack2为空时
            while(!stack1.empty()){ //当stack1不为空,就一直倒到stack2里
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    }
    
    //其他未写函数省略
}

🍃peek函数

peek函数的思路与pop函数的思路差不多,我们只需要将最后的返回并弹出stack2的栈顶元素改为👉返回stack2的栈顶元素,但是不弹出。即可。具体代码如下👇:

import java.util.*;

class MyQueue {

    public Stack<Integer> stack1 = new Stack<>();
    public Stack<Integer> stack2 = new Stack<>();

    public MyQueue() {

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

    public int pop() {
        if(stack2.empty()){ //当stack2为空时
            while(!stack1.empty()){ //当stack1不为空,就一直倒到stack2里
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    }
    
    public int peek() { //与pop的思路差不多
        if(stack2.empty()){ //当stack2为空时
            while(!stack1.empty()){ //当stack1不为空,就一直倒到stack2里
                stack2.push(stack1.pop());
            }
            return stack2.peek();
        }else{
            return stack2.peek();
        }
    }
    
    //其他未写函数省略
}

🍃empty函数

要判断是否为空,我们只需要判断stack1和stack2是不是同时为空就好😎具体代码如下👇:

import java.util.*;

class MyQueue {

    public Stack<Integer> stack1 = new Stack<>();
    public Stack<Integer> stack2 = new Stack<>();

    public MyQueue() {

    }
    
    public void push(int x) {
        stack1.push(x);
    }
    
    public int pop() {
        if(stack2.empty()){ //当stack2为空时
            while(!stack1.empty()){ //当stack1不为空,就一直倒到stack2里
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    }
    
    public int peek() { //与pop的思路差不多
        if(stack2.empty()){ //当stack2为空时
            while(!stack1.empty()){ //当stack1不为空,就一直倒到stack2里
                stack2.push(stack1.pop());
            }
            return stack2.peek();
        }else{
            return stack2.peek();
        }
    }
    
    public boolean empty() {
        return stack1.empty()&&stack2.empty();
    }
}

以上,便是全部代码啦😎让我们来运行一下逝逝~

nice😎✨

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值