题目
用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。
分析
- 栈特点:先进后出
- 队列特点:先进先出
思路
in 栈用来处理入栈(push)操作,out 栈用来处理出栈(pop)操作。一个元素进入 in 栈之后,出栈的顺序被反转。当元素要出栈时,需要先进入 out 栈,此时元素出栈顺序再一次被反转,因此出栈顺序就和最开始入栈顺序是相同的,先进入的元素先退出,这就是队列的顺序。
正序进(A)->倒序出(A)->倒序进(B)->正序出(B)
源码
package org.example.stack;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;
/**
* 用两个栈实现队列
* @author Abner G
* @date 2022/3/17 21:14
*/
public class practiceStack01 {
/**
*题目
*用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。
* https://github.com/CyC2018/CS-Notes/blob/master/notes/9.%20%E7%94%A8%E4%B8%A4%E4%B8%AA%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.md
*
*/
public static void main(String[] args) {
final MyQueue myQueue = new MyQueue();
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
for (Integer integer : integers) {
myQueue.push(integer);
}
for (Integer integer : integers) {
System.out.println(myQueue.pop());
}
}
/**
* 解题思路:
* 题目关键点:栈,队列
* 栈特点:先进后出
* 队列特点:先进先出
* in 栈用来处理入栈(push)操作,
* out 栈用来处理出栈(pop)操作。
* 一个元素进入 in 栈之后,出栈的顺序被反转。
* 当元素要出栈时,需要先进入 out 栈,
* 此时元素出栈顺序再一次被反转,
* 因此出栈顺序就和最开始入栈顺序是相同的,
* 先进入的元素先退出,这就是队列的顺序。
*
* 正序进(A)->倒序出(A)->倒序进(B)->正序出(B)
*/
}
class MyQueue{
private Stack<Integer> in = new Stack<Integer>();
private Stack<Integer> out = new Stack<Integer>();
public MyQueue() {
}
public void push(int node) {
in.push(node);
}
public Integer pop(){
if (out.isEmpty()){
// 关键点
while (!in.isEmpty()){
out.push(in.pop());
}
}
if (out.isEmpty()){
return null;
}
return out.pop();
}
}