0x01-数据结构与算法(Python)

177 阅读4分钟

小知识,大挑战!本文正在参与“  程序员必备小知识  ”创作活动 本文同时参与 「掘力星计划」  ,赢取创作大礼包,挑战创作激励金

1.栈的定义

栈是一个有次序的元素的集合。

元素从栈顶放入栈中,也从栈顶取出,一层层往上叠加,只有栈顶一个出口,所以进栈晚的先出栈

  1. 有次序的元素的集合
  2. 添加和移除都在同一端(栈顶)发生
  3. 后进先出(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.重复23操作,直到该数为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

\