用两个栈实现队列
1. 题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
考察内容:队列,栈
2. 解题思路
- 栈是一种后进先出的数据结构
- 队列是一种先进先出的数据结构
- 当一个元素位于队列的front和栈的top时,会被率先退出数据结构
- 一个元素会率先被存储在栈的top和队列的rear
- 因此,当两个栈中存储以相反的次序存储相同的元素时,就实现了队列
3. 代码实现
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
stack1.push(node);
stack2.clear();
Stack<Integer> stack = (Stack<Integer>) stack1.clone();
while(!stack.empty()){
stack2.push(stack.pop());
}
}
public int pop() {
int pop = stack2.pop();
stack1.clear();
Stack<Integer> stack = (Stack<Integer>) stack2.clone();
while(!stack.empty()){
stack1.push(stack.pop());
}
return pop;
}
}
4. 总结分析
- 使用了一个Stack作为临时存储的媒介,因为我发现使用iterator和toArray方法对Stack进行遍历始终不能得到正确的结果
- 使用iterator时,Stack的遍历是从栈的底部开始的,因此使用iterator.next()进行遍历时,使得两个栈中的数据相同,而本题目希望的正确的结果是两个栈中存储的内容是相反的。
- 使用Stack.toArray()方法会返回一个Object[]类型的数组,通过强制转换成一个Integar[]的数组,本身做法就是错误的,运行时会抛出
java.lang.ClassCastException
异常。
5. 改进方案
通过参考网友的一些做法,发现了一种更好的解题思路:
有两个栈,栈1和栈2.当入栈的时候,我们将它全放进栈1中,当需要出栈的时候,我们将栈1出栈到栈2中,然后再将栈2依次出栈。
具体的代码如下:
链接:https://www.nowcoder.com/questionTerminal/54275ddae22f475981afa2244dd448c6
来源:牛客网
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
stack1.push(new Integer(node));
}
public int pop() {
if(stack2.isEmpty()){
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
}
return stack2.pop().intValue();
}
}
此做法不仅节省了空间,也使得和删除操作更加简单。