232. 用栈实现队列
入选理由
暂无
题目地址
https://leetcode-cn.com/problems/implement-queue-using-stacks/
前置知识
- 栈
- 队列
题目描述
使用栈实现队列的下列操作:
push(x) -- 将一个元素放入队列的尾部。
pop() -- 从队列首部移除元素。
peek() -- 返回队列首部的元素。
empty() -- 返回队列是否为空。
示例:
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
说明:
你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
假设所有操作都是有效的、 (例如,一个空的队列不会调用 pop 或者 peek 操作)。
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END


















- 最新
- 最热
只看作者算法设计
加入队尾 push() : 将数字 val 加入栈 A 即可。
获取队首元素 peek() :
当栈 B 不为空: B中仍有已完成倒序的元素,因此直接返回 B 的栈顶元素。
否则,当 A 为空: 即两个栈都为空,无元素,因此返回 -1 。
否则: 将栈 A 元素全部转移至栈 B 中,实现元素倒序,并返回栈 B 的栈顶元素。
弹出队首元素 pop() :
执行 peek() ,获取队首元素。
弹出 B 的栈顶元素。
队列判空 empty() : 当栈 A 和 B 都为空时,队列为空。
class MyQueue:
核心算法思路
使用两个栈实现队列:
inStack: 用于接收新元素的输入outStack: 用于输出元素
当需要 pop 或 peek 时,如果 outStack 为空,就将 inStack 中的所有元素转移到 outStack 中,这样就实现了先入先出的特性。
代码实现
【Day 5】232. 用栈实现队列
思路- 只有在stack2中元素为空时才能将stack1中的元素放入stack2中,这样才能保证有序性
- 遍历list元素要使用while, 不能用for,否则会有元素被跳过
利用栈先进后出的性质,通过stack1完成元素的倒序放置,再将stack1的元素放入stack2中,前面的元素就放在了栈顶. 此时经过两次入栈出栈的操作stack2中的元素就满足了先进先出的要求.
但是要注意以下问题:
代码
使用兩個 stack:
in_stack: 用來接收 push
out_stack: 用來處理 pop 和 peek
當 out_stack 為空時,將 in_stack 的所有元素彈出並倒序放入 out_stack,用來模擬 queue 的 FIFO
push:O(1)
pop:O(1)
peek:O(1)
empty :O(1)
Python code
思路:
通过元素在栈之间的转移来模拟队列的先进先出。
Main Idea
We can use
stack1as the input stack, andstack2as the output stack.
push(): Push tostack1, so this new element will be on the stack top ofstack1(which is the end of our queue).pop()andpeek(): Since we usestack2as our output stack, when we callpop()orpeek():- If
stack2is empty, we want to move all elements fromstack1tostack2, and their order will be reversed, so the bottom ofstack1will be the top ofstack2, which is the head of our queue.- If not, then we have access to the top of
stack2already.
Code
思路
push和empty可以直接进行操作。pop和peek需要得到入栈的第一个元素,可以使用一个辅助栈,对第一个栈进行出栈同时第二个栈进行入栈操作,这样第二个栈top得到的元素就是第一个栈入栈的第一个元素。
用两个模拟栈的队列来实现栈的基本操作。一个用于添加尾部元素,另一个用于弹出头部元素。即一个近栈stack in和一个出栈stack out。
思路- 设计双栈,一个用于存放入队数据,一个用于存放出队数据。
- 各个操作的实现思路:
- push:将数据压入pushData栈中。
- pop:如果popData栈为空,则将pushData栈中的数据全部弹出并压入popData栈中。然后弹出popData栈的栈顶元素。
- peek:同pop操作,最后一步返回popData栈的栈顶元素。
- empty:判断两个栈是否为空。
思維一:以暴力解的方式在 peek 或 pop 的操作時,用另一個陣列依序存目前 stack pop 出來的所有元素,操作結果後再依序新增回去,時間及空間複雜度皆為 O(N)(無實作)
思維二:使用兩個 stack 來操作存取,當有 peek 或 pop 的操作時,從 out_stack 拿取,判斷 out_stack 為空時再一次性的把當前 in_stack 的所有元素倒進 out_stack
代碼:
透過第二個 stack 倒轉第一個 in-stack 的順序,以達到 FIFO 的效果
js代码
思路:用两个栈模拟操作,在 peek 的时候出第二个栈的顶部即可