栈和数组存储数据的方式一样,它们都只是元素的列表。不同之处在于栈的以下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))