小知识,大挑战!本文正在参与“ 程序员必备小知识 ”创作活动 本文同时参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金
1.栈的定义
栈是一个有次序的元素的集合。
元素从栈顶放入栈中,也从栈顶取出,一层层往上叠加,只有栈顶一个出口,所以进栈晚的先出栈
- 有次序的元素的集合
- 添加和移除都在同一端(栈顶)发生
- 后进先出(LIFO)
2.生活中的栈场景
- 盘子
- 托盘
- 书架
3.栈的特性:反转次序
- 进出栈次序相反
- 进的晚的出来的早
- 应用场景: - 浏览器浏览网页时的后退功能,后退的是最近访问的(最晚访问的) - 撤销功能同理
4.栈的类的定义
- Stack():初始化一个空栈,无任何元素
- push(element):添加元素方法
- pop():移除元素方法(返回移除的元素)
- get_top():访问栈顶元素(只返回栈顶元素,不做其他操作,如删除之类)
- is_empty():判断栈是否为空
5.代码实现
class Stack:
def __init__(self):
self.stack = []
def push(self, element):
"""添加元素"""
self.stack.append(element)
def pop(self):
"""删除元素"""
return self.stack.pop()
def get_top(self):
"""取栈顶元素"""
if len(self.stack) > 0:
return self.stack[-1]
else:
return None
def is_empty(self):
return len(self.stack) == 0
题目一:括号匹配
括号匹配问题:给一个字符串,其中包含小括号、中括号、大括号,求该字符串中的括号是否匹 配。
-
例如:
()()[]{}匹配([{()}])匹配[](不匹配[(])不匹配
1.核心思路:
若为左括号入栈,若为右括号则访问栈顶元素是否与之匹配,匹配则弹出栈顶元素,反之匹配失败
2.解题步骤:
括号匹配
1. 初始化栈
2. 准备一个字典,用来检查右括号是否匹配正确左括号
3. 遍历参数
4. 如果是左括号就进栈
5. 否则就是右括号
5.1 在右括号情况下,如果栈空,直接false
5.2 若不空,取栈顶元素看是否匹配括号,匹配,则出栈
5.3 不匹配,false
6.1.遍历结束,栈空为true
6.2.不空为false
3.代码实现:
def brace_match(s):
"""
括号匹配
"""
# 1.初始化栈
stack = Stack()
# 2.准备一个字典,用来检查右括号是否匹配正确左括号
match = {')': '(', ']': '[', '}': '{'}
# 3.遍历参数
for ch in s:
# 4.如果是左括号就进栈
if ch in ['(', '[', '{']:
stack.push(ch)
else: # 5.否则就是右括号
if stack.is_empty():
# 5.1.在右括号情况下,如果栈空,直接false
return False
elif stack.get_top() == match[ch]:
# 5.2.若不空,取栈顶元素看是否匹配括号,匹配,则出栈
stack.pop()
else: # 5.3.不匹配,false
return False
# 6.1.遍历结束,栈空为true
if stack.is_empty():
return True
else: # 6.2.不空为false
return False
题目二:十进制转二进制
我们通常使用的是十进制数字,但是计算机都是用二进制,十进制转二进制一般采用短除法,不断地对2取余,取出的余数之后的整数部分再取余,最后将余数从下往上倒着写出来就是转换好的二进制
1.核心思路:
短除法最后的余数从下往上,符合栈的特性后进先出
2.解题步骤:
1.初始化栈
2.将该数对2进行取余(余数非零即1),将余数放进栈中
3.然后将该数除以2之后的整数部分重新赋值给该变量
4.重复2、3操作,直到该数为0(不可能为负)
5.最后栈中的数字就是转化好的二进制,不过顺序应该是倒叙(从栈顶到栈底)
6.最后将栈中数字逐个pop出来用字符串连接,即为二进制字符串
3.代码实现:
def divideBy2(decNumber):
"""
十进制转化二进制
"""
# 1.初始化栈
remstack = Stack()
while decNumber > 0: # 4.重复2、3操作,直到该数为0(不可能为负)
# 2.将该数对2进行取余(余数非零即1),将余数放进栈中
remstack.push(decNumber % 2)
# 3.然后将该数除以2之后的整数部分重新赋值给该变量
decNumber = decNumber // 2
# 5.最后栈中的数字就是转化好的二进制,不过顺序应该是倒叙(从栈顶到栈底)
binString = ''
while not remstack.is_empty():
# 6.最后将栈中数字逐个pop出来用字符串连接,即为二进制字符串
binString += str(remstack.pop())
return binString
\