剑指 Offer 09. 用两个栈实现队列

剑指 Offer 09. 用两个栈实现队列

题目描述:

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

示例1:

输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]

示例2:

输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]

数据限制:

1 <= values <= 10000

最多会对 appendTail、deleteHead 进行 10000 次调用

思路:

先考虑栈和队列的特性

栈实现的是数据的先入后出,队列实现的是数据的先入先出

题目要求给定两个栈,模拟出队列的功能

可以这样考虑:一个栈只能实现数据的先入后出,先进入栈中的数据会被保存在栈低,后进入栈中的数据会被保存在栈顶,那么我们用一个栈存储当前的数据,当要进行出栈操作时,我们可以把一个栈中的数据依次弹出,然后压入另一个栈中,那么在另一个栈中,原本的栈底元素到达了栈顶,原本的栈顶元素到达了栈底,之后只要依次弹出元素,实现的就是先入先出的功能

 

解题步骤:

  • 设置两个Stack的全局变量a 和 b,对于CQueue,初始化两个栈

  • 对于数据入队的操作,只要把数据顺序压入a中即可

  • 对于数据出队的操作:

    • 先查询 b 栈中是否有数据,b 栈中存储的为 从a 栈得来的逆序的数据,如果有,则直接弹出数据,并返回

    • 如果 b 栈中没有数据,查询 a 中是否有数据,如果 a 为空,即表示队列中没有元素,可直接返回

    • 由于b 栈中没有数据,a 中存有数据,则进行 a 的逆序操作,a 弹出一个元素,b就压入一个元素,直到a 为空

  • 经过上述操作,b 中拥有了 a 中原本数据的逆序,可以直接弹出元素

时间复杂度:O(n)(入队为O(1),出队为O(n))

空间复杂度:O(n)

代码:

import java.util.Stack;
​
class CQueue {
    Stack<Integer> a, b;
    public CQueue() {
        a = new Stack<>();
        b = new Stack<>();
    }
    
    public void appendTail(int value) {
        a.add(value);
    }
    
    public int deleteHead() {
        if (!b.empty()) return b.pop();
        if (a.empty()) return -1;
        while(!a.empty()){
            b.add(a.pop());
        }
        return b.pop();
    }
}
​
/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue obj = new CQueue();
 * obj.appendTail(value);
 * int param_2 = obj.deleteHead();
 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值