今日学习的文章链接和视频链接
leetcode题目地址:225. 用队列实现栈
代码随想录题解地址:代码随想录
题目简介
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
实现 MyStack
类:
void push(int x)
将元素 x 压入栈顶。int pop()
移除并返回栈顶元素。int top()
返回栈顶元素。boolean empty()
如果栈是空的,返回true
;否则,返回false
。
看到题目的第一想法(可以贴代码)
- Java Queue类
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。
LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
java
class MyStack {
Queue<Integer> q1;
Queue<Integer> q2;
public MyStack() {
q1 = new LinkedList<>();
q2 = new LinkedList<>();
}
public void push(int x) {
if(q1.isEmpty()) q2.offer(x);
else q1.offer(x);
}
public int pop() {
if(q1.isEmpty()){
dump();
return q2.poll();
} else{
dump();
return q1.poll();
}
}
public int top() {
if(q1.isEmpty()){
dump();
int res = q2.element();
q1.offer(q2.poll());
return res;
} else{
dump();
int res = q1.element();
q2.offer(q1.poll());
return res;
}
}
public boolean empty() return q1.isEmpty() && q2.isEmpty();
public void dump(){
if(q1.isEmpty()) while (q2.size() > 1) q1.offer(q2.poll());
else while (q1.size() > 1) q2.offer(q1.poll());
}
}
实现过程中遇到哪些困难
无
看完代码随想录之后的想法
【解题思路】Java Queue 的基础操作。
看完视频自己写的ACC:
java
class MyStack {
Queue<Integer> q1;
Queue<Integer> q2;
public MyStack() {
q1 = new LinkedList<>();
q2 = new LinkedList<>();
}
public void push(int x) {
q2.offer(x);
while (!q1.isEmpty()) q2.offer(q1.poll());
Queue<Integer> temp = q2;
q2 = q1;
q1 = temp;
}
public int pop() {
return q1.poll();
}
public int top() {
return q1.element();
}
public boolean empty() {return q1.isEmpty();}
}
学习时长
略
今日收获
- Java Queue类
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。
LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
【初始化】Queue<String> queue = new LinkedList<String>();
队列 Queue接口(LinkeList类) 常用方法
//add()和remove()方法在失败的时候会抛出异常(不推荐)
** add** 增加一个元索 如果队列已满,则抛出IIIegaISlabEepeplian异常
** remove** 移除并返回队列头部的元素 如果队列为空,则抛出NoSuchElementException异常
** element** 返回队列头部的元素 如果队列为空,则抛出NoSuchElementException异常
** offer** 添加一个元素并返回true 如果队列已满,则返回false
** poll** 移除并返问队列头部的元素 如果队列为空,则返回null
** peek** 返回队列头部的元素 如果队列为空,则返回null
** put** 添加一个元素 如果队列满,则阻塞
** take** 移除并返回队列头部的元素 如果队列为空,则阻塞
**drainTo(list)**一次性取出队列所有元素
queue.isEmpty()
, 为空返回true
,不为空返回false
。queue.size()
, 为空返回0
,不为空返回一个大于1的整数。
知识点: remove、element、offer 、poll、peek 其实是属于Queue接口。
- 【初始化】
Queue<String> q1 = new LinkedList<String>();
Queue<Integer> q1 = new ArrayDeque<>();
Deque<Integer> q1 = new ArrayDeque<>();
3. 双端队列 Deque类 常用方法
由于Deque继承了Queue接口,因此它继承了Queue接口的所有方法,Deque还包括以下方法:
-
addFirst() - 在双端队列的开头添加指定的元素。如果双端队列已满,则引发异常。
-
addLast() - 在双端队列的末尾添加指定的元素。如果双端队列已满,则引发异常。
-
offerFirst() - 在双端队列的开头添加指定的元素。如果双端队列已满,则返回false。
-
offerLast() - 在双端队列的末尾添加指定的元素。如果双端队列已满,则返回false。
-
getFirst() - 返回双端队列的第一个元素。如果双端队列为空,则引发异常。
-
getLast() - 返回双端队列的最后一个元素。如果双端队列为空,则引发异常。
-
peekFirst() - 返回双端队列的第一个元素。如果双端队列为空,则返回null。
-
peekLast() - 返回双端队列的最后一个元素。如果双端队列为空,则返回null。
-
removeFirst() - 返回并删除双端队列的第一个元素。如果双端队列为空,则引发异常。
-
removeLast() - 返回并删除双端队列的最后一个元素。如果双端队列为空,则引发异常。
-
pollFirst() - 返回并删除双端队列的第一个元素。如果双端队列为空,则返回null。
-
pollLast() - 返回并删除双端队列的最后一个元素。如果双端队列为空,则返回null。