问题:请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false。
方法:1.先创建两个队列
2.push(int x)将元素x压入栈顶:要考虑两种情况。第一种两个栈都为空的时候,放到队列1中。第二种情况,哪个队列已有元素就放到哪个队列里。
3.pop() 移除并返回栈顶元素:首先要判断两个队列是否都为空。然后若队列1不为空 ,则把除最后一个元素(相当于栈顶元素)之外数从队列1中删除的同时移到队列2中,最后再利用e.poll()返回并删除最后一个元素的值(这个不移入队列2)。若队列2不为空则是一样的做法。
注:此模块中在for循环中不可以直接使用i<qu1.size()-1,因为size()每for循环一次就变化一次,因此size()不可以出现在循环条件内
4.top() 返回栈顶元素:在3.的基础上稍加改动,不删除元素了,循环条件直接改为i<size,将有元素的队列全部移入空队列,此时循环完时,e的返回值就是栈顶元素。
代码:
class MyStack {
private Queue<Integer> qu1=new LinkedList<>();
private Queue<Integer> qu2=new LinkedList<>();
public MyStack() {
}
//将元素 x 压入栈顶。
public void push(int x) {
if(!qu1.isEmpty()){
qu1.offer(x);
}else if(!qu2.isEmpty()){
qu2.offer(x);
}else{
qu1.offer(x);
}
}
//移除并返回栈顶元素。
public int pop() {
if(empty()){
return -1;
}
int e=-1;
if(!qu1.isEmpty()){
int size= qu1.size();
for(int i=0;i<size-1;i++){
e=qu1.poll();
qu2.offer(e);
}
e=qu1.poll();
}else{
int size= qu2.size();
for(int i=0;i<size-1;i++){
e=qu2.poll();
qu1.offer(e);
}
e=qu2.poll();
}
return e;
}
//返回栈顶元素
public int top() {
if(empty()){
return -1;
}
int e=-1;
if(!qu1.isEmpty()){
int size= qu1.size();
for(int i=0;i<size;i++){
e=qu1.poll();
qu2.offer(e);
}
}else{
int size= qu2.size();
for(int i=0;i<size;i++){
e=qu2.poll();
qu1.offer(e);
}
}
return e;
}
//如果栈是空的,返回 true ;否则,返回 false
public boolean empty() {
return qu1.isEmpty()&&qu2.isEmpty();
}
}