用两个堆栈实现队列

方法一:
既然堆栈是先入后出,那么两个堆栈第一个用于加入尾数据时存储,第二个用于删除头数据时将第一个堆栈中的元素按先入后出再加入第二个堆栈,这样第二个堆栈顶部就是当前队列的头元素,此时就可以删除头元素。
删除后再将第二个堆栈元素放回第一个堆栈继续添加数据的操作。

LinkedList<Integer> stack1;
    LinkedList<Integer> stack2;
    public CQueue() {
        this.stack1 = new LinkedList<>();
        this.stack2 = new LinkedList<>();
    }

    public void appendTail(int value) {
        stack1.addLast(value);
    }

    public int deleteHead() {
        int res;
        if (stack1.isEmpty()) {
            return -1;
        }
        while (!stack1.isEmpty()) {
            stack2.addLast(stack1.removeLast());
        }
        res = stack2.removeLast();
        while (!stack2.isEmpty()) {
            stack1.addLast(stack2.removeLast());
        }
        return res;
    }

方法二:

public int deleteHead1() {
        if (stack2.isEmpty()) {
            while (!stack1.isEmpty()) {
                stack2.addLast(stack1.removeLast());
            }
        }
        if (stack2.isEmpty()) {
            return -1;
        }

        return stack2.removeLast();
    }

思路是两个堆栈分别用于添加尾数据和删除头数据,添加的函数和方法一相同,即堆栈一用于添加数据。
堆栈二用于删除数据,即当堆栈二为空,需要将堆栈一的元素全部按先入后出规则放入堆栈二,再次判断
若仍然为空,则说明队列无元素。
若非空,将堆栈二堆顶的元素删除即可。

方法二相对于方法一省去了将删除后元素放回的步骤,实际将一串数据两次添加到堆栈中,第二个堆栈里的数据就是按先入先出原则排列的,此时堆栈一仍然保持添加数据的功能,当遇到删除头数据只需要将堆栈二的堆顶数据依次删除即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔幻音

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值