逐步解析力扣71. 简化路径(双端队列/栈)

https://leetcode-cn.com/problems/simplify-path/

在这里插入图片描述
说了很多,其实就几个条件,输出一定要以“/”作为开头,所有目录以“/”区分,可以使用split进行分解,使用sb进行append,无视“. .”和“.”,最后还要无视字符串尾部的“/”,返回结果

使用栈来解决,这里使用deque,先区分下java支持的几种栈和队列:

Stack(LIFO,头部添加、头部删除、后进先出)
Queue(FIFO,尾部添加、头部删除、先进先出)
Deque(双端队列,头部尾部添加、头部尾部删除,Java官方推荐使用Deque替代Stack)

Stack原理
栈是Vector的一个子类,它实现了一个标准的后进先出的栈。
在这里插入图片描述
Vector 是 AbstractList 子类并实现 List 接口
ArrayList 和 Vector 都继承自 AbstractList并实现 List 接口
从上面所有的分析,我们知道了Stack 本质也是一个 List。其具备 List 所有方法。

Stack使用
堆栈只定义了默认构造函数,用来创建一个空栈。堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法。
在这里插入图片描述
Queue原理
Java集合中的Queue继承自Collection接口,Deque,LinkedList,PriorityQueue,BlockingQueue等类都实现了它。Queue 用来存放等待处理元素的集合,这种场景一般用于缓冲、并发访问。

Queue使用
除了继承 Collection 接口的一些方法,Queue 还添加了额外的添加、删除、查询操作。
在这里插入图片描述

Deque原理
Deque是一个双端队列接口,继承自Queue接口,Deque的实现类是LinkedList、ArrayDeque、LinkedBlockingDeque,其中LinkedList是最常用的。大多数 Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。

Deque使用
此接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是专为使用有容量限制的 Deque 实现设计的;在大多数实现中,插入操作不能失败。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

代码

public String simplifyPath(String path) {
        String[] names = path.split("/");
        Deque<String> stack = new ArrayDeque<>();
        for (String name:names) {
            if ("..".equals(name)){
                if (!stack.isEmpty()){
                    stack.pollLast();
                }
            }else {
                if (!".".equals(name) && name.length()>0){
                    stack.offerLast(name);
                }
            }
        }
        StringBuilder ans = new StringBuilder();
        if (stack.isEmpty()){
            ans.append("/");
        }else {
            while (!stack.isEmpty()){
                ans.append("/");
                ans.append(stack.pollFirst());
            }
        }
        return ans.toString();
    }

我们用到的栈其实只需要用offer和poll来进行增删,操作很简单

整个流程就在于把分隔好后的数组先过滤一遍,不必要的字符不入栈内,最后再重新用分隔符“/”拼起来

先分隔,创建双端队列作为栈,开始遍历。蓝框处理了“. .”的字符,把". ."之前入栈的数据删除,代表了返回上一级目录;红框筛选字符串是否为当前目录“.”然后入栈。注意这里都是在处理双端队列的尾部,也就是栈尾
在这里插入图片描述

最后一步从栈头一个个出栈,拼好后直接返回
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值