题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
①可以用一个取巧的方法,java的stack有个很搞的地方,就是有个add的方法,这个方法可以进行对指定位置进行添加元素
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.add(0,node);//只用一个栈就行了,在最底下去插入元素,但是这种方法其实违背了栈的思想
}
public int pop() {
return stack1.pop();
}
}
②我们可以用两个栈
队列时,输入一个4,然后把这个4存入栈1中,然后队列在输入一个5,在存入栈1中。
此时队列 4 5
栈一是 5
4
然后想去输出的话,按照队列应该先输出5的,这时就需要另一个栈来实现这一操作了,我们把栈1的元素(全部)拿出来都存入栈2中,这样再去取栈2的顶元素,就可以第一个输出4了
栈一 null 栈二 4
5
返回栈顶元素即可,相当于出队
注意每次入队操作时,要把元素从栈1转移到栈2的时候,一定要注意栈2要为空,不为空的话,就不转移,直接把栈2的元素继续取栈顶的输出即可,入队的新元素先放到栈1中,等到栈2为空的时候,在进行出队操作时,再将栈1的全部元素压入到栈2
例如 入队 4 5
栈一 5 栈二 null
4
出队一个 此时栈2为空
栈一 null 栈二 4
5
然后返回栈2的顶部,即为出队4
栈一 null 栈二 5
在入队一个 6 然后栈1添加6
栈一 6 栈二 5
此刻再出队,注意,栈二不是空的
所以不能将6压入栈2,否则栈2栈顶就是6了,再出队输出的就是6了,按队列规则应该是输出5的,
所以栈二不是空的时候,就继续输出栈2的栈顶就行了,不把元素压入到栈2
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);//压入栈1
}
public int pop() {
if (stack2.empty()) {//为空,就把栈1的元素全部压入栈2,然后输出栈2的栈顶
while (!stack1.empty()) {
stack2.push(stack1.pop());
}
}
//栈2不为空,那么不能将栈1的元素压入到栈2,否则会乱序,不能实现先进先出,
// 所以就是直接输出栈2的栈顶,等到空的时候在将栈1的全部元素压进来
return stack2.pop();
}
}