day10 | 栈和队列 232 225

LeetCode 232 用栈实现队列

* 一个输入栈,一个输出栈实现先入先出

package algor.trainingcamp;

import java.util.Stack;

/**
 * @author lizhe
 * @version 1.0
 * @description: 用栈实现队列
 * @date 2023/4/14 07:53
 *
 *
 * 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
 *
 * 实现 MyQueue 类:
 *
 * void push(int x) 将元素 x 推到队列的末尾
 * int pop() 从队列的开头移除并返回元素
 * int peek() 返回队列开头的元素
 * boolean empty() 如果队列为空,返回 true ;否则,返回 false
 * 说明:
 *
 * 你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
 * 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
 *
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode.cn/problems/implement-queue-using-stacks
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 *
 *  准备两个栈来模拟队列(输入栈 和 输出栈)
 */
public class LeetCode232 {

}

class MyQueue {
    Stack<Integer> stack1;
    Stack<Integer> stack2;

    public MyQueue() {
        stack1 = new Stack<>();
        stack2 = new Stack<>();
    }

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

    public int pop() {
        if(stack2.isEmpty()){
            while(!stack1.isEmpty()){
                stack2.push(stack1.pop());
            }
        }

        return stack2.pop();
    }

    public int peek() {
        if(stack2.isEmpty()){
            while(!stack1.isEmpty()){
                stack2.push(stack1.pop());
            }
        }

        return stack2.peek();
    }

    public boolean empty() {
        return stack1.isEmpty() && stack2.isEmpty();
    }
}

LeetCode225 用队列实现栈

* 使用一个备份队列,保证每一次之前的数据在新插入数据的后面

package algor.trainingcamp;

import java.util.LinkedList;
import java.util.Queue;

/**
 * @author lizhe
 * @version 1.0
 * @description: 225. 用队列实现栈
 * @date 2023/4/14 08:04
 *
 * 保证每一次之前的数据都在新插入的数据后面 需要一个额外的备份队列
 */
public class LeetCode225 {
}

class MyStack {
    Queue<Integer> queue1;
    Queue<Integer> queue2;

    public MyStack() {
        queue1 = new LinkedList<>();
        queue2 = new LinkedList<>();
    }

    public void push(int x) {
        queue1.add(x);

        /**
         * 需要保证之前的数据依旧存在于x的前面,用到备份队列 将b队列中的元素全部转给a
         */
        while(!queue2.isEmpty()){
            queue1.offer(queue2.poll());
        }

        // 交换a和b,使得a队列没有在push()的时候始终为空队列
        Queue temp = queue1;
        queue1 = queue2;
        queue2 = temp;
    }

    public int pop() {
        return queue2.poll();
    }

    public int top() {
        return queue2.peek();
    }

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

    public static void main(String[] args) {
        MyStack stack1 = new MyStack();
        stack1.push(1);
        stack1.push(2);
        stack1.push(3);

        stack1.pop();
        stack1.push(4);
        stack1.pop();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值