擅長處理臨時資料的結構——棧

Mysticbinary發表於2024-09-14

目錄
  • 實踐1 —— 從字串中移除星號


棧和陣列儲存資料的方式一樣,它們都只是元素的列表。不同之處在於棧的以下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))

相關文章