棧和數組存儲數據的方式一樣,它們都只是元素的列表。不同之處在于棧的以下3個限制:
- 數據只能從棧末插入;
- 數據只能從棧末刪除;
- 只能讀取棧的最后一個元素。
棧和隊列、鏈表...一樣,都是抽象的數據結構,
何為抽象數據結構? 它指一種數據組織的形式,它不關注具體的實現細節,而是專注于數據的邏輯結構和操作。在計算機科學中,抽象的數據結構定義了數據的組織方式和允許的操作,但不指定如何在計算機中實現這些操作的具體細節。
簡而言之,棧在很多編程語言中沒有具體的實現,你可以在數組的基礎,自己給數組加上前文提的三個使用限制、使用方式,那么這個數組就是你想要的棧了。
實踐1 —— 從字符串中移除星號
題目要求

解題思路:
考慮使用棧(stack)來幫助解決這個問題,因為棧的后進先出(LIFO)特性非常適合這個需求。
然后考慮*號的兩種位置:
- *a
- a*
分別對應下面兩種棧處理流程。先看 A * 位置的處理流程:
讀取第一個坐標,

讀取第二個坐標,pop掉棧里的元素

讀取第三個坐標,

讀取第四個坐標,

再看 * A 位置的處理流程:
第一次讀取,

第二次讀取,

第三次讀取,flag -= 1

第四次讀取,

第五次讀取,

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))
浙公網安備 33010602011771號