个人博客主页:http://myblog.nxx.nx.cn
代码GitHub地址:https://github.com/nx-xn2002/Data_Structure.git
Day10
232. 用栈实现队列
题目链接:
https://leetcode.cn/problems/implement-queue-using-stacks/
题目描述:
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(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
(双端队列)来模拟一个栈,只要是标准的栈操作即可。
思路:
题目让我们使用两个栈来实现队列,已知栈是先进后出的数据结构,队列是先进先出,因此显然要想使得先被压入栈中的元素先被弹出,只使用一个栈是不够的,需要一个辅助栈来实现,将原栈中的元素都放入到辅助栈里再进行出栈操作,就能够做到先压入的元素先被弹出来。于是,对于题目要求实现的各个方法有以下实现思路(下面设数据栈为栈A,辅助栈为栈B):
void push(int x)
将元素 x 推到队列的末尾:直接将元素压入栈A中即可int pop()
从队列的开头移除并返回元素:如果栈B不为空,则出栈并返回栈B的栈顶元素。否则,将栈A所有元素依次出栈并压入到栈B中,然后出栈并返回栈B的栈顶元素int peek()
返回队列开头的元素:如果栈B不为空,则返回栈B的栈顶元素。否则,将栈A所有元素依次出栈并压入到栈B中,然后返回栈B的栈顶元素boolean empty()
如果队列为空,返回true
;否则,返回false
:若栈A和栈B均为空,则返回true
,否则,返回false
代码实现:
class MyQueue {private Stack<Integer> stack1;private 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 stack2.isEmpty() && stack1.isEmpty();}
}
225. 用队列实现栈
题目链接:
https://leetcode.cn/problems/implement-stack-using-queues/
题目描述:
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
实现 MyStack
类:
void push(int x)
将元素x
压入栈顶int pop()
移除并返回栈顶元素int top()
返回栈顶元素boolean empty()
如果栈是空的,返回true
;否则,返回false
注意:
你只能使用队列的标准操作 —— 也就是 push to back
、peek/pop from front
、size
和 is empty
这些操作。
你所使用的语言也许不支持队列。 你可以使用 list
(列表)或者 deque
(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
思路:
这一题和上一题思路类似,只需要牢牢抓住栈和队列的特点就行了。也是需要两个队列来实现,基本各方法实现思路如下(队列A为数据队列,队列B为辅助队列):
void push(int x)
将元素x
压入栈顶:如果队列A为空,则直接将x
入队。否则,将队列A中所有元素出队并入队到队列B中,将x
入队到队列A中然后将队列B中所有元素出队并入队到队列A中int pop()
移除并返回栈顶元素:直接将队列A的队首元素出队并返回即可int top()
返回栈顶元素:将队列A的队首元素返回即可boolean empty()
如果栈是空的,返回true
;否则,返回false
:若队列A为空,则返回true
,否则,返回fasle
代码实现:
class MyStack {Queue<Integer> data;Queue<Integer> help;public MyStack() {data = new LinkedList<>();help = new LinkedList<>();}public void push(int x) {while (!data.isEmpty()) {help.add(data.poll());}data.add(x);while (!help.isEmpty()) {data.add(help.poll());}}public int pop() {return data.poll();}public int top() {return data.peek();}public boolean empty() {return data.isEmpty();}
}
总结:今天的题目基本都比较简单,核心都是深入理解栈和队列的特点