版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011877584/article/details/82119671
package com.fjf.test;
import java.util.ArrayDeque;
import java.util.Queue;
/**
*
* @author fjf
* 2018年8月18日 19:16:52
* 用两个队列实现栈
* 出的时候需要中转,露出“最后进来的”,让后进的先出
*/
public class TestTwoQueueForStack {
public static void main(String[] args) {
Solution s = new Solution();
s.add(1);
s.add(2);
s.add(3);
s.remove();
s.add(4);
s.add(5);
s.remove();
s.remove();
s.remove();
s.remove();
System.out.println("---------两种方法分界线--------------");
Solution2 s2 = new Solution2();
s2.add(1);
s2.add(2);
s2.add(3);
s2.remove();
s2.add(4);
s2.add(5);
s2.remove();
s2.remove();
s2.remove();
s2.remove();
}
//queue2 作缓存,作中转站(挪数据) queue1 作进出操作
static class Solution{
Queue<Integer> queue1 = new ArrayDeque<Integer>();
Queue<Integer> queue2 = new ArrayDeque<Integer>();
public void add(int node){
while(!queue2.isEmpty()){
queue1.add(queue2.remove());
}
queue1.add(node);
}
public int remove(){
while(!queue2.isEmpty()){
queue1.add(queue2.remove());
}
//当queue1里面的多于一个
while(queue1.size()>1){
queue2.add(queue1.remove());
}
//剩一个让queue1 输出
int value = queue1.remove();
System.out.println(value);
return value;
}
}
//数据进queue1 , 出的时候互相中转。 推荐
static class Solution2{
Queue<Integer> queue1 = new ArrayDeque<Integer>();
Queue<Integer> queue2 = new ArrayDeque<Integer>();
public void add(int node){
queue1.add(node);
}
public int remove(){
//总体里面是有值的
int value ;
if(qsize()>0){
//先来看看是不是queue1里面有
if(!queue1.isEmpty()){
putToanother(queue1, queue2);
value = queue1.remove();
}else{
//queue1里面没有,那就是queue2里面有值
putToanother(queue2, queue1);
value = queue2.remove();
}
}else{
System.out.println("为空了");
value = -1;
}
System.out.println(value);
return value;
}
//总的值 长度
private int qsize(){
return queue1.size()+queue2.size();
}
private void putToanother(Queue qfrom,Queue qTo){
while(qfrom.size()>1){
qTo.add(qfrom.remove());
}
}
}
}