用两个队列实现栈

核心思想

用两个队列来实现栈,因为栈是后进先出的,而队列是先进先出的,所以必须保持至少有一个空队列,每次入栈的时候都要将入栈元素放到非空队列队尾,当然第一次都是空队列,随便选一个入队就行,出栈时,将非空队列里面的元素依次出队然后入队到另一个空队列中,只剩下一个元素作为出栈元素,这样就满足了栈后进先出的特点。下面附上完整java代码

import java.util.LinkedList;
import org.junit.Test;
public class StackByTwoQueue {
    private LinkedList<Integer> queue1=new LinkedList<Integer>();
    private LinkedList<Integer> queue2=new LinkedList<Integer>();

    public StackByTwoQueue() {
        super();
    }

    /**
     * 入栈
     * @param ele 要入栈的元素
     */
    private void push(Integer ele){//入栈时两个队列至少有一个是空队列
        if(isEmpty()){//如果两个队列全是空的,则必须要选择一个队列加入新元素
            queue1.add(ele);
            return;//提前结束,避免过多的比较
        }
        //只在非空队列加入新元素
        if(!queue1.isEmpty()){
            queue1.add(ele);
            return;//避免多余的比较,提前结束
        }
        //只在非空队列加入新元素
        if(!queue2.isEmpty()){
            queue2.add(ele);
        }
    }

    private boolean isEmpty(){
        if(queue1.isEmpty() && queue2.isEmpty()){
            return true;
        }else{
            return false;
        }
    }
    /**
     * 出栈
     * @return 栈顶元素
     */
    private Integer pop(){
        if(isEmpty()){
            try {
                throw new Exception("栈空");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        if(queue1.isEmpty()){//将非空队列里面的元素依次出队,最后只剩下一个作为出栈元素
            while(queue2.size()>1){
                queue1.add(queue2.poll());
            }
            return queue2.poll();
        }

        if(queue2.isEmpty()){//将非空队列里面的元素依次出队,最后只剩下一个作为出栈元素
            while(queue1.size()>1){
                queue2.add(queue1.poll());
            }
            return queue1.poll();
        }
        return null;
    }

    @Test
    public void testStackByTwoQueue(){
        StackByTwoQueue stack=new StackByTwoQueue();
        for (int i =0; i <4; i++) {
            stack.push(i);
        }

        while(!stack.isEmpty()){
            System.out.print(stack.pop()+" ");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36442947/article/details/80796153