大家可以先看视频,了解一下模拟的过程,然后写代码会轻松很多。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0232.%E7%94%A8%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.html
先了解stack的方法有什么:
boolean empty():判断栈是否为空,如果栈为空则返回 true,否则返回 false。
E peek():查看栈顶元素,但不弹出。返回栈顶元素。
E pop():弹出栈顶元素并返回。从栈中移除并返回栈顶元素。
E push(E item):将元素推入栈顶。将元素压入栈顶。
int search(Object o):搜索元素在栈中的位置,返回距离栈顶最近的位置索引,如果元素不在栈中则返回 -1。
232. 用栈实现队列
class MyQueue {
Stack<Integer> stackIn;
Stack<Integer> stackOut;
public MyQueue() {
// 构造函数初始化两个栈
stackIn = new Stack<>();
stackOut = new Stack<>();
}
public void push(int x) {
// 将元素推入 stackIn 栈,即入队操作
stackIn.push(x);
}
public int pop() {
// 执行出队操作,从 stackOut 栈中弹出元素
// 如果 stackOut 栈为空,则先将 stackIn 栈中的元素转移到 stackOut 栈中
dumpStackIn();
return stackOut.pop();
}
public int peek() {
// 返回队列的头部元素,即 stackOut 栈的栈顶元素
// 如果 stackOut 栈为空,则先将 stackIn 栈中的元素转移到 stackOut 栈中
dumpStackIn();
return stackOut.peek();
}
public boolean empty() {
// 判断队列是否为空,如果两个栈都为空,则队列为空
return stackIn.isEmpty() && stackOut.isEmpty();
}
// 如果 stackOut 栈为空,那么将 stackIn 栈中的元素全部转移到 stackOut 栈中
private void dumpStackIn() {
if (!stackOut.isEmpty()) {
return; // 如果 stackOut 栈不为空,则不需要转移元素
}
while (!stackIn.isEmpty()) {
stackOut.push(stackIn.pop()); // 将 stackIn 栈中的元素逐个弹出并推入 stackOut 栈
}
}
}
225. 用队列实现栈
两个队列来实现栈的思路。
队列是先进先出的规则,把一个队列中的数据导入另一个队列中,数据的顺序并没有变,并没有变成先进后出的顺序。
所以用栈实现队列, 和用队列实现栈的思路还是不一样的,这取决于这两个数据结构的性质。
但是依然还是要用两个队列来模拟栈,只不过没有输入和输出的关系,而是另一个队列完全用来备份的!
先了解一下queue的方法:
Queue 接口是Java中表示队列的接口,它是一种先进先出(FIFO)的数据结构。以下是 Queue 接口中常见的方法:
boolean add(E e):将指定的元素插入队列尾部,如果成功则返回 true,如果队列已满则抛出异常。
boolean offer(E e):将指定的元素插入队列尾部,如果成功则返回 true,如果队列已满则返回 false。
E remove():移除并返回队列头部的元素,如果队列为空则抛出异常。
E poll():移除并返回队列头部的元素,如果队列为空则返回 null。
E element():返回队列头部的元素,如果队列为空则抛出异常。
E peek():返回队列头部的元素,如果队列为空则返回 null。
int size():返回队列中的元素个数。
boolean isEmpty():判断队列是否为空。
void clear():清空队列中的所有元素。
boolean contains(Object o):判断队列是否包含指定的元素。
Iterator iterator():返回一个迭代器,用于遍历队列中的元素。
这些方法提供了对队列的基本操作,包括添加元素、移除元素、获取元素、判断队列是否为空以及获取队列的大小等功能。
Queue 接口的常见实现类有 LinkedList、ArrayDeque 等。这些实现类提供了具体的队列实现,并实现了 Queue 接口中的方法。
class MyStack {
Queue<Integer> queue1; // 用于保存栈中的元素
Queue<Integer> queue2; // 辅助队列
public MyStack() {
// 构造函数初始化两个队列
queue1 = new LinkedList<>();
queue2 = new LinkedList<>();
}
public void push(int x) {
// 将元素先放入辅助队列 queue2
queue2.offer(x);
// 将 queue1 中的元素依次放入 queue2
while (!queue1.isEmpty()) {
queue2.offer(queue1.poll());
}
// 将 queue2 中的元素依次放入 queue1
while (!queue2.isEmpty()) {
queue1.offer(queue2.poll());
}
-
}
public int pop() {
// 弹出栈顶元素,即从 queue1 中出队一个元素
return queue1.poll();
}
public int top() {
// 返回栈顶元素,即查看 queue1 的队首元素
return queue1.peek();
}
public boolean empty() {
// 判断栈是否为空,即判断 queue1 是否为空
return queue1.isEmpty();
}
}