刷刷刷 Day10 | 232. 用栈实现队列
232. 用栈实现队列
LeetCode题目要求
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(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(双端队列)来模拟一个栈,只要是标准的栈操作即可。
示例
输入: ["MyQueue", "push", "push", "peek", "pop", "empty"] [[], [1], [2], [], [], []] 输出: [null, null, null, 1, 1, false] 解释: MyQueue myQueue = new MyQueue(); myQueue.push(1); // queue is: [1] myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue) myQueue.peek(); // return 1 myQueue.pop(); // return 1, queue is [2] myQueue.empty(); // return false
解题思路
可以按照题目要求,使用两个栈来操作,根据栈的特性后进先出。一个用于临时 push 操作,一个用户存储全部的数据,用于 pop peek 等操作
上代码
class MyQueue { // 用于放元素操作 Deque<Integer> pushStack; // 用于取出操作 Deque<Integer> popStack; public MyQueue() { pushStack = new ArrayDeque<Integer>(); popStack = new ArrayDeque<Integer>(); } public void push(int x) { // 如果 popStack 为空时,可以直接按把 值 放入 popStack if (popStack.size() == 0) { popStack.push(x); } else { // 如果 popStack 不为空,那么就得把新元素放到栈底,就先把 popStack 中的值放到 pushStack,再放入新元素到 popStack,然后再把 pushStack 中的元素移动到 popStack while (popStack.peek() != null) { pushStack.push(popStack.pop()); } popStack.push(x); while (pushStack.peek() != null) { popStack.push(pushStack.pop()); } } } public int pop() { return popStack.pop(); } public int peek() { return popStack.peek(); } public boolean empty() { return popStack.size() == 0; } }
说明:与资料不同的地方是这里 push 时,直接将元素转换了一次放入到了 popStack 中,但不是最优,相对来说比较容易理解,最优可以看下方资料。
附:学习资料链接
分类:
算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2017-01-09 log4jdbc 与 logback 集合打印日志过多的解决
2016-01-09 double精度的坑与BigDecimal