0
点赞
收藏
分享

微信扫一扫

leetcode 剑指offer刷题

架构大数据双料架构师 2022-02-08 阅读 104

剑指offer09:用两个栈实现队列

首先看到这个题我也是一脸懵,看了好几遍也没看懂题目是什么意思,然后就去看了评论区的解释,然后才看懂,看懂题目之后就比较好做了,所以首先解释一下题目。

示例的输入一共有两行,第一行是要做的操作,第二行则是操作对应的参数。比如"CQueue"初始化一个队列,不需要参数,所以第二行对应的是[ ],对应输出为null;"appendTail"在队列尾部插入整数,对应的参数为[3],即在队尾插入整数3,同样地输出也为null;"deleteHead"在队列头部删除整数,对应的参数为[ ],即不需要参数,但是现在队头为3,执行删除操作之后,会输出删除的队头,所以输出为3;再执行deleteHead,此时队列中没有元素,所以返回为-1。

我是采用java语言写的,看完题目之后,首先想到了初始化两个stack,一个栈用来存放插入的元素,另一个栈用来记录弹出的元素。"appendTail"在尾部插入,对应的为压栈操作,即stack1.push();而删除队头"deleteHeada"则可以将stack1的队头(即栈顶)弹出,并压入stack2。

但是在实现的时候没有考虑时间和空间的因素,也算是一种暴力解法,看了题解和评论区的大佬,发现自己要改进的地方还有很多。

具体实现代码如下:

class CQueue {
    private Stack<Integer> stk1;
    private Stack<Integer> stk2;

    public CQueue() {
       stk1 = new Stack<Integer>();
       stk2 = new Stack<Integer>();       
    }
    
    public void appendTail(int value) {
        stk1.push(value);
    }
    
    public int deleteHead() {
        if(stk2.isEmpty()){
            if(stk1.isEmpty()){
                return -1;
            }else{
                while(!stk1.isEmpty()){
                    stk2.push(stk1.pop());
                }
                return stk2.pop();
            }
            
        }else{
            return stk2.pop();
        }
    }
}
举报

相关推荐

0 条评论