Leetcode 刷题日记 2021.2.6(补充)

本文探讨了如何使用栈和链表来实现队列,重点关注时间复杂度和空间复杂度的优化。作者对比了两种实现方式:栈和LinkedList,分析了它们在性能上的差异,并指出在Java中LinkedList作为栈的实现可能更为高效。文章还提醒读者在实际编程中考虑使用LinkedList以提高性能,并提供了相关代码实现和运行结果。
摘要由CSDN通过智能技术生成

Leetcode 刷题日记
2021.2.6(补充)

题目链接:
https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/solution/mian-shi-ti-09-yong-liang-ge-zhan-shi-xian-dui-l-3/

问题描述:
用两个栈实现队列
在这里插入图片描述

解答1:
用Stack实现

代码:

import java.util.Stack;

class CQueue {

    Stack<Integer> appendStack = new Stack<>();
    Stack<Integer> deleteStack = new Stack<>();
    public CQueue() {

    }

    public void appendTail(int value) {
        if(appendStack.isEmpty() && !deleteStack.isEmpty()) {
            pour(deleteStack,appendStack);
            appendStack.push(value);
        }else if(deleteStack.isEmpty()){
            appendStack.push(value);
        }
    }

    public int deleteHead() {
        if(!appendStack.isEmpty() && deleteStack.isEmpty()){
            pour(appendStack,deleteStack);
            return deleteStack.pop();
        }else if(appendStack.isEmpty() && !deleteStack.isEmpty()) return deleteStack.pop();
        return -1;
    }

    private static void pour(Stack from,Stack to){
        while(!from.isEmpty()){
            to.push(from.pop());
        }
    }
}

分析:
时间复杂度:O(n)
空间复杂度:O(n)

运行结果:
在这里插入图片描述

评注:
可以把队列和栈分别类比为正号和负号,正如两个负号之后得到的是正数,使用两个栈,也能实现队列。这里笔者对代码进行了简单的优化,如果连续执行同样的操作(入队或出队),元素不必在两个栈之间反复倾倒。结合前几道题目,我们不难发现,栈有两大比较重要的功能,一是倒序功能(把栈中元素倾倒出去后,元素反序),二是有序存取功能(若元素按升序存入,则一定被逆序取出),后者可以视为前者的特殊应用,但有时在解决有关问题时难以想到这一点,具体题目可参考上一篇日记https://blog.csdn.net/m0_51404298/article/details/113731106

解答2:
用LinkedList实现

代码:

import java.util.LinkedList;
import java.util.Stack;

class CQueue {

    LinkedList<Integer> appendStack = new LinkedList<>();
    LinkedList<Integer> deleteStack = new LinkedList<>();
    public CQueue() {

    }

    public void appendTail(int value) {
        if(appendStack.isEmpty() && !deleteStack.isEmpty()) {
            pour(deleteStack,appendStack);
            appendStack.push(value);
        }else if(deleteStack.isEmpty()){
            appendStack.push(value);
        }
    }

    public int deleteHead() {
        if(!appendStack.isEmpty() && deleteStack.isEmpty()){
            pour(appendStack,deleteStack);
            return deleteStack.pop();
        }else if(appendStack.isEmpty() && !deleteStack.isEmpty()) return deleteStack.pop();
        return -1;
    }

    private static void pour(LinkedList from,LinkedList to){
        while(!from.isEmpty()){
            to.push(from.pop());
        }
    }
}


分析:
时间复杂度:O(n)
空间复杂度:O(n)

运行结果:
在这里插入图片描述

评注:
在Java中,Stack是通过维护一个Vector来实现的,而Vector的底层是一个数组,这就导致其改变容量和增删元素时会产生较大的时间开销。考虑到这一点,解法二改为通过维护两个LinkedList来实现队列。
查阅API文档可知,LinkedList完全能实现Stack的功能,其本身就有pop()和push()两个方法,所以在以后的编程实践中,为了实现更优性能,完全可以用它代替Stack。
运行结果说明,链式实现优于数组实现;而Stack之所以没有采用链式实现,笔者认为是因为LinkedList产生晚于Stack(Stack实现于java1.0,LinkedList实现于java1.2)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值