思路:
栈是先进后出,队列是先进先出,所以只靠一个栈是不能实现队列的,但是两个栈就可以,一个栈s1用来模拟入队列,一个栈s2用来出队列,当需要pop和peek时,如果s2为空,则将s1里的元素又放进s2,因为放进s1的时候是先进后出,所以s1放进s2的时候又是后进先出,这样操作,相当于负负得正了,最后s2的栈顶元素,就是最先入s1的元素
class MyQueue {
Stack<Integer> s1;
Stack<Integer> s2;
public MyQueue() {
s1=new Stack<>();//用来模拟入队列
s2=new Stack<>();//用来模拟出队列
}
public void push(int x) {
s1.push(x);
}
public int pop() {
if(empty()){//如果模拟队列为空
return -1;
}
if(s2.isEmpty()){//如果s2为空
int size=s1.size();
for(int i=0;i<size;i++){
s2.push(s1.pop());//将s1里面移动过来
}
}
return s2.pop();//出队列
}
public int peek() {
if(empty()){//如果模拟队列为空
return -1;
}
if(s2.isEmpty()){//如果s2为空
int size=s1.size();
for(int i=0;i<size;i++){
s2.push(s1.pop());//将s1里面移动过来
}
}
return s2.peek();//获取队头元素
}
public boolean empty() {
if(s1.isEmpty()&&s2.isEmpty()){
return true;
}else{
return false;
}
}
}