Leetcode 232. 用栈实现队列
思路
这道题考查我们对栈和队列的基本操作,两个数据结构的区别在于,栈是先入后出,队列是先入先出。由于先入后出,当需要出元素时,无法拿到先入的元素,所以我们还需要一个栈B,即将栈A(原来的栈)出来的元素按顺序进入栈B。
下面有动画帮助大家理解。
代码(Java)
class MyQueue {
Stack<Integer> stackIn;
Stack<Integer> stackOut;
public MyQueue() {
stackIn = new Stack<>();
stackOut = new Stack<>();
}
//将一个元素放入队列的尾部
public void push(int x) {
stackIn.push(x);
}
//从队列首部移除元素
public int pop() {
dumpstackIn();
return stackOut.pop();
}
//返回队列首部的元素
public int peek() {
dumpstackIn();
return stackOut.peek();
}
//返回队列是否为空
public boolean empty() {
return stackIn.isEmpty() && stackOut.isEmpty();
}
private void dumpstackIn() {
if (!stackOut.isEmpty())
return;
while (!stackIn.isEmpty()){
stackOut.push(stackIn.pop());
}
}
}
代码随想录链接
下面是代码随想录的文章链接与视频链接,帮助大家更好地理解这道题。
文章
视频
Leetcode 225. 用队列实现栈
思路
受到上道题的启示,这道题我们可能也想到用两个队列模拟出栈和入栈,但是由于队列本身有两个口,栈仅有一个口。所以当模拟弹栈时,只需要将队列头部的元素(除了最后一个元素外)重新添加到队列尾部,再Pop即可。
代码(Java)
写法1:一个Queue实现
class MyStack {
Queue<Integer> queue;
public MyStack() {
queue = new LinkedList<>();
}
public void push(int x) {
queue.offer(x);
int size = queue.size();
while (size-- >1){
queue.offer(queue.poll());
}
}
public int pop() {
return queue.poll();
}
public int top() {
return queue.peek();
}
public boolean empty() {
return queue.isEmpty();
}
}
/**
* Your MyStack object will be instantiated and called as such:
* MyStack obj = new MyStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* boolean param_4 = obj.empty();
*/
写法2:一个Deque实现
class MyStack {
// Deque 接口继承了 Queue 接口
// Queue 中的 add、poll、peek等效于 Deque 中的 addLast、pollFirst、peekFirst
Deque<Integer> deque;
public MyStack() {
deque = new ArrayDeque<>();
}
public void push(int x) {
deque.addLast(x);
}
public int pop() {
int size = deque.size();
size--;
while (size-- > 0) {
deque.addLast(deque.peekFirst());
deque.pollFirst();
}
int res = deque.pollFirst();
return res;
}
public int top() {
return deque.peekLast();
}
public boolean empty() {
return deque.isEmpty();
}
}
/**
* Your MyStack object will be instantiated and called as such:
* MyStack obj = new MyStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* boolean param_4 = obj.empty();
*/
代码随想录链接
下面是代码随想录的文章链接与视频链接,帮助大家更好地理解这道题。
文章
视频
总结
在栈实现队列这道题里面,是用了两个栈去实现队列,再做队列实现栈的时候也容易惯性思维,用两个队列实现栈,但是由于队列数据结构的特殊性,我们只需要用一个队列就可以实现栈。