栈(Stack)
栈是一个有次序的数据集,每个数据项仅从”栈顶“一端加入到数据集中、从数据集中移除,栈具有后进先出(LIFO)特性。
- 在栈中,数据项的加入和移除都仅发生在同一端;这一端叫做栈顶top,另一端叫栈底base;
- 距离栈底越近的数据,留在栈中的时间越长;
- 后进先出LIFO特性;
- 翻转次序,进栈和出栈的次序正好相反。
ls = [1,2,3,'dog',5,6,7,8]
s = Stack()
for i in ls:
s.push(i)
while not s.isEmpty():
print(s.pop())
栈的实现
数组(列表实现)栈。
# 创建一个空栈,不包含任何数据
class Stack(object):
def __init__(self):
self.items = []
# 返回栈是否为空
def isEmpty(self):
return self.items == []
# 将数据添加到栈顶
def push(self, item):
self.items.append(item)
#将栈顶数据移除
def pop(self):
return self.items.pop()
# 返回栈顶数据,不修改栈
def peek(self):
return self.items[len(self.items)-1]
# 返回栈中数据长度
def size(self):
return len(self.items)
from ADT_CLASS import Stack
s = Stack()
print(s.isEmpty())
s.push(1)
s.push('cat')
print(s.peek())
s.push(3)
print(s.size())
s.push(4)
print(s.pop())
print(s.pop())
print(s.size())
输出:
True
cat
3
4
3
2
栈的应用
LeetCode 20th(有效的括号)
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
from ADT_CLASS import Stack
def isValid(s):
stack = Stack()
com = True
index = 0
while index < len(s) and com:
if s[index] in '([{':
stack.push(s[index])
else:
if stack.isEmpty():
com = False
else:
l = stack.pop()
if not matches(l, s[index]):
com = False
index += 1
if com and stack.isEmpty():
return True
else:
return False
def matches(l,r):
opens = '([{'
closers = ")]}"
return opens.index(l) == closers.index(r)
LeetCode 405. 数字转换为十六进制数
进制转换:
二进制有两个不同数字:0,1
八进制有八个不同数字:0,1,2,3,4,5,6,7
十六进制有十六个不同数字:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
在代码中我们可以通过调参base实现不同进制转换。
from ADT_CLASS import Stack
def toConverter(num, base):
digits = '0123456789ABCDEF'
s = Stack()
while num > 0:
cur = num % base
s.push(cur)
num = num // base
ans = ''
while not s.isEmpty():
ans += digits[s.pop()]
return ans
注意:这里我们只处理了num>0的转换情况,如果是小于等于0的数需要另外讨论。
ADT_CLASS为我写的类文件,这样在使用的时候导入就可以了,比较方便。