day10-栈与队列01

232.用栈实现队列 
思路:

        用栈实现队列 ,创建两个栈,一个输入栈一个输出栈 先将元素压入输入栈,弹出的时候将输入栈元素全部压入输出栈,这样就形成了先进先出实现队列了

class MyQueue {

    Stack<Integer> stackIn;
    Stack<Integer> stackOut;

    public MyQueue() {
        stackIn = new Stack<>();    //负责进栈元素
        stackOut = new Stack<>();
    }
    
    public void push(int x) {
        stackIn.push(x);
    }
    
    public int pop() {
        dumpstackIn();
        return stackOut.pop();
    }
    
    public int peek() {
        dumpstackIn();
        return stackOut.peek();
    }
    
    public boolean empty() {
        //两个栈全为空,队列才为空
        return stackIn.isEmpty() && stackOut.isEmpty();
    }

    // 如果stackOut为空,那么将stackIn中的元素全部放到stackOut中
    private void dumpstackIn(){
         //输出栈不为空
        if(!stackOut.isEmpty()) return;
        while(!stackIn.isEmpty()){
            stackOut.push(stackIn.pop());
        }
    }
}

 225. 用队列实现栈 

1、Deque与Queue
        了解这个之前,我们要先知道什么是Deque,它和Queue有什么区别:在java中,Queue被定义成单端队列使用,Deque被定义成双端队列 即Queue可以访问两端但是只能修改队头,而Deque可以访问两端并且可以在队首和队尾删除和插入元素。
基于Deque的特性,ArrayDeque即可以作为Queue来使用也可以作为栈来使用,而且可以决定队列那边受限或者栈哪边进出。

两个队列实现栈,一个主要队列 q1,一个临时存放队列 q2。

思路:第一次将元素添加q1,第二次添加元素先将q1里面的元素全部转移到q2,再将元素添加到q1,然后再将q2里面的元素转移到q1末尾 这样就实现了先进后出的栈。

class MyStack {
    //两个队列实现栈
    //主要队列
    Queue<Integer> q1 = new LinkedList<>();
    //临时队列
    Queue<Integer> q2 = new LinkedList<>();
    public MyStack() {

    }
    //第一次将元素添加q1,第二次添加元素先将q1里面的元素全部转移到q2,再将元素添加到q1,然后再将q2里面的元素转移到q1末尾 这样就实现了先进后出的栈
    public void push(int x) {
        //判断q1是否有元素,如果有将元素全部转移到q2;
        while(!q1.isEmpty()){
            q2.add(q1.poll());
        }
        //第一次添加元素直接加入q1
        q1.add(x);
        //再将转移到q2里面的元素全部又转移回来
        while(!q2.isEmpty()){
            q1.add(q2.poll());
        }
    }
    
    public int pop() {
        return q1.poll();
    }
    
    public int top() {
        return q1.peek();
    }
    
    public boolean empty() {
        return q1.isEmpty();
    }
}

优化:一个队列实现栈

思路:每 offer 一个数(A)进来,都重新排列,把这个数(A)放到队列的队首,倒序放入队列
class MyStack {
    //每 offer 一个数(A)进来,都重新排列,把这个数(A)放到队列的队首
    Queue<Integer> q1 = new LinkedList<>();

    public MyStack() {

    }
    
    public void push(int x) {
        q1.add(x);
        //移动除去当前元素的其他数,移动到队列末尾
        int size = q1.size();
        while(size-- > 1){
            q1.add(q1.poll());
        }
    }
    
    public int pop() {
        return q1.poll();
    }
    
    public int top() {
        return q1.peek();
    }
    
    public boolean empty() {
        return q1.isEmpty();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值