用两个队列实现一个栈
栈:先进后出;
队列:先进先出
为了将队列达到栈的要求,在这里用了两个队列来实现这个栈;
public Queue<Integer> qu1;
public Queue<Integer> qu2;
public Solution5(){
qu1 = new LinkedList<>();
qu2 = new LinkedList<>();
}
定义两个队列qu1和qu2;
入栈:首先确定入对的条件,若果两个队列都是空的,默认把入栈的元素放到qu1中,如果两个队列中其中任意一个队列有元素,将入栈的元素放到有元素的这个队列中;
if(!qu1.isEmpty()){
qu1.offer(val);
}else if(!qu2.isEmpty()){
qu2.offer(val);
}else {
qu1.offer(val);
}
出栈:如果栈里面没有元素,就返回-1;在入栈的时候就已经知道有一个队列是有元素的的,一个队列是空的,所以在出栈的时候只需确定那个栈里有元素。
public int pop(){
if(empty()){
return -1;
}
if(!qu1.isEmpty()){
int len = qu1.size();
int cur = -1;
for (int i = 0; i < len-1; i++) {
cur = qu1.poll();
qu2.offer(cur);
}
return qu1.poll();
} else {
int len = qu2.size();
int cur = -1;
for (int i = 0; i < len-1; i++) {
cur = qu2.poll();
qu1.offer(cur);
}
return qu2.poll();
}
}
每次将有元素的队列的元素,放到另一个为空的队列中,最后一个元素不需要放,这样就获取到了栈顶的元素,并且将其删除了。在这里要注意,在得到这个队列的长度的方法中,队列的长度一直在变,所以每次都要重新获取队列的长度。
返回栈顶元素且不删除,只需将有元素的队列中的元素放到另一个队列中返回它最后一个值;
public int top(){
if(empty()){
return -1;
}
if(!qu1.isEmpty()){
int len = qu1.size();
int cur = -1;
for (int i = 0; i < len; i++) {
cur = qu1.poll();
qu2.offer(cur);
}
return cur;
} else {
int cur = -1;
int len = qu2.size();
for (int i = 0; i < len; i++) {
cur = qu2.poll();
qu1.offer(cur);
}
return cur;
}
}
判断栈是否为空
public boolean empty(){
return qu1.isEmpty() && qu2.isEmpty();
}