代码随想录算法训练营第十天 | LeetCode232.用栈实现队列、LeetCode225.用队列实现栈

LeetCode 232 用栈实现队列

题目链接:232.用栈实现队列

本题考查的是我们对栈和队列的掌握程度。

【解题思路】

用一个栈作为压入栈,在压入数据时只往这个栈中压入,记为stackPush;另一个栈只作为弹出栈,在弹出数据时只从这个栈弹出,记为stackPop。

【解题步骤】

1.push栈向pop栈倒入数据:

        判断Pop栈是否为空:如果为空,则向pop栈倒入数据,直到倒空为止;如果不为空,则结束。

2.向队列中添加元素:

        1)向push栈压入元素;

        2)将push栈的元素倒入pop栈。

3.队列出队:

        1)判断pop栈与push栈是否为空:如果为空,则弹出警告,队列为空;

        2)将push栈的元素倒入pop栈;

        3)返回并移除pop栈顶元素。

4.返回队列开头元素:

        1)判断pop栈与push栈是否为空,若为空,返回错误警告;

        2)将push栈的元素倒入pop栈;

        3)返回pop栈顶元素。

【代码部分】

java:

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() {
        if(empty()){
            throw new RuntimeException("Queue is empty!");
        }
        stackOut.push(stackIn.pop());
        return stackOut.pop();
    }
    
    public int peek() {
        if(empty()){
            throw new RuntimeException("Queue is empty!");
        }
        stackOut.push(stackIn.pop());
        return stackIn.peek();
    }
    
    public boolean empty() {
        if(stackIn.isEmpty() && stackOut.isEmpty()){
            return true;
        }else return false;
    }

    private void dumpstackIn(){
        if(!stackOut.isEmpty())return;
        while(!stackIn.isEmpty()){
            stackOut.push(stackIn.pop());
        }
    }
}

【疑难点】

1.如果stackPush要往stackPop中压入数据,那么必须一次性把stackPush中的数据全部压入。

2.如果stackPop不为空,stackPush绝对不能向stackPop中压入数据。

LeetCode 225 用队列实现栈

题目链接:225. 用队列实现栈

打开思路,本题并不一定需要两个队列来模拟栈,其实用一个队列就可以了。

【解题思路】

本题既可以用两个队列实现,也可以用一个队列实现:

方法一,用两个队列实现:
        队列一将除了最后进栈的一位元素之外的所有元素弹出,队列二把队列一弹出的元素进队记录下来,循环往复

方法二,用一个队列实现:
将队列里的元素依次弹出,每次弹出后重新进栈,直到当前队尾的元素到达队头。

【解题步骤】

方法一:

                1.构造函数:
                                        在函数前新建两个队列queue1与queue2,在函数里初始化这两个队列。

                 2.入栈操作:
                                        1)将要入栈元素放入辅助队列;
                                        2)循环将当前队列元素放入辅助队列;
                                        3)创建一个临时队列,辅助两个队列完成交换元素;
                                        4)两个队列交换元素,最后将元素全放入queue1中。

                3.出栈操作:
                                        因为在入栈时,queue1中的元素与栈中保持一致,所以接下来的操作只看queue1的即可。

                4.返回栈顶元素:
                                       返回queue1中的元素即可。

                5.判断当前栈是否为空:
                                        判断queue1中的元素是否为空即可。

方法二:

                1.创建一个新队列;

                2.构造函数:
                                初始化新队列。

                3.入栈操作:
                                直接将元素用queue.add()方法添加进队列。

                4.出栈操作:
                                1)调用第七步函数,将队列中的元素重新排列;        

                                2)调用queue.poll()方法,返回出队的值。

                5.返回栈顶元素:
                                1)调用第七步函数,将队列中的元素重新排列;
                                2)将队头元素出队,新建一个临时变量result接收出队元素;
                                3)为了不丢失这个“栈顶元素”,需要将队头元素重新用add方法入队;
                                4)返回result。

                6.判断当前栈是否为空:
                                判断队列是否为空即可。

                7.创建一个新函数,用来将队列调换位置,模拟栈:
                                1)新建一个size元素,用来记录queue的长度;
                                2)循环将队列里的元素出队再进队,,每次移动size减一,直到size小于1。

【代码部分】

java:

class MyStack {
        Queue<Integer> queue;

    public MyStack() {
        queue = new LinkedList<>();
    }
    
    public void push(int x) {
        queue.add(x);
    }
    
    public int pop() {
        rePosition();
        return queue.poll();
    }
    
    public int top() {
        rePosition();;
        int result = queue.poll();
        queue.add(result);
        return result;
    }
    
    public boolean empty() {
        return queue.isEmpty();
    }

    private void rePosition(){
        int size = queue.size();
        size --;
        while(size-- > 0){
            queue.add(queue.poll());
        }
    }
}
  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值