两个栈实现队列,两个队列实现栈

两个栈实现队列

队列每次只能删除头,只能在末尾添加,“先进先出”原则
栈“先进后出”

package queue;

import java.util.Stack;

//用“栈”实现队列
public class QueueTest<T> {
    // 向队列添加数据时:(01) 将“已有的全部数据”都移到mIn中。 (02) 将“新添加的数据”添加到mIn中。
    private Stack<T> mIn = null;
    // 从队列获取元素时:(01) 将“已有的全部数据”都移到mOut中。(02) 返回并删除mOut栈顶元素。
    private Stack<T> mOut = null;

    private int mCount = 0;

    public QueueTest() {
        mIn = new Stack<T>();
        mOut = new Stack<T>();
        mCount = 0;
    }

    private void add(T t) {
        // 将“已有的全部数据”都移到mIn中
        while (!mOut.empty())
            mIn.push(mOut.pop());
        // 将“新添加的数据”添加到mIn中
        mIn.push(t);
        mCount++;
    }

    private T get() {
        // 将“已有的全部数据”都移到mOut中
        while (!mIn.empty())
            mOut.push(mIn.pop());
        mCount--;
        return mOut.pop();
    }

    private boolean isEmpty() {
        return mCount == 0;
    }
    //测试
    public static void main(String[] args) {
        QueueTest list = new QueueTest();
        list.add(10);
        list.add(20);
        list.add(30);

        while(!list.isEmpty()){
            System.out.println(list.get());
        }
    }
}

两个队列实现栈

package stack;
import java.util.ArrayDeque;
import java.util.Queue;

public class StackTest {
    Queue<Integer> queue1 = new ArrayDeque<>();
    Queue<Integer> queue2 = new ArrayDeque<>();

    public void push(Integer node) {
        // 两个队列都为空时,优先考虑queue1
        queue1.add(node);
    }

    public int pop() {
        // 两个栈都为空时,没有元素可以弹出
        if (queue1.isEmpty() && queue2.isEmpty()) {
            try {
                throw new Exception("stack is empty");
            } catch (Exception e) {
            }
        }
        // 如果queue1为空,queue2有元素, 将queue2的元素依次放入queue1中,直到最后一个元素,我们弹出。
        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 (Integer) null;
    }

    public static void main(String[] args) {
        StackTest s = new StackTest();
        s.push(1);
        s.push(2);
        s.push(3);
        s.push(4);
        System.out.println(s.pop());
        System.out.println(s.pop());
        s.push(5);
        System.out.println(s.pop());
        System.out.println(s.pop());
        System.out.println(s.pop());
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值