本文参考于《python数据结构与算法分析》
栈
栈:它是有序集合,添加操作和移除操作总发生在同一端,即"顶端",另一端被称为"低端"。栈中的元素离低端越近,代表其在栈中的时间越长,最新添加的元素将被最先移除。这种排序原则被称作LIFO(last-in-first-out),即后进先出。
场景:每一个浏览器都有返回按钮,当我们从一个网页跳到另一个网页时,这些网页实际上是URL都被存放在一个栈中。当前正在浏览的网页位于栈的顶端,最早浏览的网页则位于低端。如果点击按钮,便开始反向浏览这些网页。
栈抽象数据类型
- Stack():创建一个空栈
- push(item):添加一个元素
- pop():将元素移除
- peek():返回顶端元素
- isEmpty():检查栈是否为空
- size():返回元素的数目
class Stack:
""":arg
将表的尾端当做栈的顶端
"""
def __init__(self):
self.item = []
def push(self, item):
return self.item.append(item)
def pop(self):
return self.item.pop()
def isEmpty(self):
return self.item == []
def size(self):
return len(self.item)
def peek(self):
return self.item[len(self.item)-1]
def test():
s = Stack()
print(s.isEmpty())
s.push(4)
s.push("dog")
print(s.peek())
s.push(True)
print(s.size())
print(s.isEmpty())
s.push(10.1)
print(s.pop())
print(s.pop())
if __name__ == '__main__':
test()
result:
True
dog
3
False
10.1
True
class Stack:
""":arg
将表头部当做栈顶
"""
def __init__(self):
self.item = []
def push(self, item):
return self.item.insert(0, item)
def pop(self):
return self.item.pop(0)
def peek(self):
return self.item[0]
def isEmpty(self):
return self.item == []
def size(self):
return len(self.item)
虽然都可以实现栈的数据结构,但是性能方面有所差异。第一种实现的push和pop方法的时间复杂度都是O(1)(append,和pop)。而第二种的复杂度为O(n)(insert(0)和pop(0))。
括号匹配问题
正常情况下括号应该是左右匹配的
思路:初始化一个空栈,从左往右处理括号。如遇到左括号加入栈中,如果遇到右括号,就做出栈操作,处理到最后应该是空的就代表匹配成功。
def Checker(symbolString):
s = Stack() #上述的Stack
balanced = True #默认是匹配的
index = 0 #初始化索引为0
while index<len(symbolString) and balanced:
symbol = symbolString[index]
if symbol == "(":
s.push(symbol)
else:
if s.isEmpty(): #判断提前为空不匹配
balanced = False
else:
s.pop()
index += 1
if balanced and s.isEmpty():
return True
else:
return False
#测试
print(Checker("()()()(())"))
print(Checker("(()))"))
#结果
True
False
十进制转二进制
def dec2bin(num):
remstack = Stack() #初始化
while num > 0:
rem = num % 2 # 233 % 2 = 1
remstack.push(rem)
num = num // 2 #233 //2 = 116
binString = ""
while not remstack.isEmpty():
binString += str(remstack.pop())
return binString
#测试
print(dec2bin(233))
#结果
11101001
``