ETJava Beta | Java    注册   登录
  • 搜索:
  • 擅长处理临时数据的结构——栈

    发表于      阅读(1)     博客类别:Crawler     转自:https://www.cnblogs.com/mysticbinary/p/18367554
    如有侵权 请联系我们删除  (页面底部联系我们)  


    栈和数组存储数据的方式一样,它们都只是元素的列表。不同之处在于栈的以下3个限制

    • 数据只能从栈末插入;
    • 数据只能从栈末删除;
    • 只能读取栈的最后一个元素。

    队列链表...一样,都是抽象的数据结构
    何为抽象数据结构? 它指一种数据组织的形式,它不关注具体的实现细节,而是专注于数据的逻辑结构和操作。在计算机科学中,抽象的数据结构定义了数据的组织方式和允许的操作,但不指定如何在计算机中实现这些操作的具体细节。

    简而言之,栈在很多编程语言中没有具体的实现,你可以在数组的基础,自己给数组加上前文提的三个使用限制、使用方式,那么这个数组就是你想要的栈了。

    实践1 —— 从字符串中移除星号

    题目要求
    image

    解题思路:
    考虑使用栈(stack)来帮助解决这个问题,因为栈的后进先出(LIFO)特性非常适合这个需求。

    然后考虑*号的两种位置:

    • *a
    • a*

    分别对应下面两种栈处理流程。先看 A * 位置的处理流程:
    读取第一个坐标,
    image
    读取第二个坐标,pop掉栈里的元素
    image
    读取第三个坐标,
    image
    读取第四个坐标,
    image

    再看 * A 位置的处理流程:
    第一次读取,
    image

    第二次读取,
    image

    第三次读取,flag -= 1
    image

    第四次读取,
    image

    第五次读取,
    image

    code参考:
    代码不是很优化,只是实现了这个功能。

    class Solution:
        def removeStars(self, s: str) -> str:
            index_letters = []
            flag = 0
            for i, v in enumerate(s):
                if v == "*":
                    if len(index_letters) == 0:
                        flag += 1
                    if len(index_letters) >= 1:
                        flag -= 1
                        index_letters.pop()
                if v != "*":
                    index_letters.append(v)
    
                if len(index_letters) >= 1:
                    for i in range(flag):
                        if (len(index_letters) != 0):
                            index_letters.pop()
                            flag -= 1
    
            newStr = ""
            for v1 in index_letters:
                newStr += v1
            return newStr
    
    
    s = Solution()
    s2 = "leet**cod*e"
    s1 = "**o*d*ety"
    print(s.removeStars(s2))