请利用两个栈s1和s2来模拟一个队列。己知栈的三个运算定义如下。PU3H(ST,x):元素x入ST栈;PoP(ST,x):ST栈项元素出栈,赋给变量x;Sempty(ST):判ST栈空否。那么如何用栈的运算来实现该队列的三个运算:enqueue:插入一个元素入队列;dequeue:删除一个元素出队列;queue_empty:判队列为空。(请写明算法的思想及必要的注释)
class MyQueue {
private Stack<Integer> s1 = new Stack<>();//s1 入队的栈
private Stack<Integer> s2 = new Stack<>();//s2 出队的栈
//每次入到s1的栈,如果s2不是空的,那么把s2里面的元素全部倒进s1,再入
public void enqueue(int x){
if (s1.empty()) {
while(!s2.empty()){
s1.push(s2.pop());
}
}
s1.push(x);
}
//每次出s2的栈顶元素,如果s2是空的,那么把s1里面的元素全部倒过来s2,再出
public int dequeue(){
if(empty()){
return -1;
}
if(s2.empty()){
while(!s1.empty()){
s2.push(s1.pop());
}
}
return s2.pop();
}
public boolean empty(){
return s1.empty() && s2.empty();
}
} class MyQueue {
//初始化两个队列
private Stack<Integer> s1;//s1入队的栈
private Stack<Integer> s2;//s2出队的栈
//入队列指定到s1
//出队列,每次出s2的栈顶元素,如果s2是空的,那么把s1里面的元素全部倒过来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.empty()){
while(!s1.empty()){
int x = s1.pop();
s2.push(x);
}
}
return s2.pop();
}
public int peek(){
if(empty()){
return -1;
}
if(s2.empty()){
while(!s1.empty()){
int x = s1.pop();
s2.push(x);
}
}
return s2.peek();
}
public boolean empty(){
return s1.empty() && s2.empty();
}
}