LeetCode讲解算法2-数据结构[栈和队列](Python版)

news2024/11/15 7:20:40

文章目录

  • 一、栈
    • 1.1 栈的定义
    • 1.2 栈的实现分析步骤
    • 1.3 栈的应用
      • 匹配圆括号
      • 匹配符号
      • 模2除法(十进制转二进制)
      • 进制转换
  • 二、队列
    • 2.1 单向队列
    • 2.2 双端队列
    • 2.3 队列的应用
      • 验证回文串
      • 滑动窗口最大值


一、栈

1.1 栈的定义

  栈是一种线性数据结构,栈是元素的有序集合,其元素的顺序取决于添加顺序或移除顺序,它有两端,称作顶端和底端,即对应栈的栈顶和栈底,栈中元素的添加称为入栈,而元素的移除称为出栈,栈中元素的添加操作和移除操作都发生在其顶端。
  栈中最后添加的元素将最先被移除,栈的排序原则被称作LIFO,即后进先出,最先添加的元素在栈底,它最后最移出。简单来说,可比喻为几本书或砖头叠在一起,需要依次从上至下一本一本地拿出书,最下面的那本书最后被拿出。

1.2 栈的实现分析步骤

  1、创建一个空栈,通过构造方法创建一个空列表;

class Stack:
    def __init__(self):
        self.items = []  # 创建一个空栈,它不需要参数,且会返回一个空栈

  2、向栈(栈顶)中添加元素,通过列表的append()或insert()实现添加新的元素至栈中。(若将列表的尾部作为栈的顶端,则通过append()实现;而若将列表的头部作为栈的顶端,则通过insert()实现,insert()第一个参数表示索引位置,第二个参数即要添加的元素,由于是向栈顶添加元素,则第一个参数为0(列表的下标从0开始));

def push(self, item):
        self.items.append(item)  # 将一个元素添加到栈的顶端,它需要一个参数item,且无返回值【self.items.insert(0,item)】

  3、删除栈顶元素,通过列表的pop()实现删除栈顶的元素。(若将列表的尾部作为栈的顶端,pop()内无参数,即此时删除列表的末尾元素,也就是栈的顶端元素;而若将列表的头部作为栈的顶端,则pop(0)表示移除列表中下标为0的元素);

def pop(self):
        return self.items.pop()  # 将栈顶的元素移除,它不需要参数,但会返回顶端的元素,且修改栈的内容【return self.items.pop(0)】

  4、返回栈顶元素,若将列表的尾部作为栈的顶端,则通过len()先取得列表的长度,由于下标是从0开始,所以要减1;而若将列表的头部作为栈的顶端,则直接通过索引列表下标为0的元素);

def peek(self):
        return self.items[len(self.items) - 1]  # 返回栈顶端的元素,它不需要参数,不会修改栈的内容【return self.items[0]】

  5、检查栈是否为空,通过比较运算符“==”比较栈是否为空,若为空,则返回布尔值False,若不为空,则返回True;

 def isEmpty(self):
        return self.items == []  # 检查栈是否为空,它不需要参数,且会返回一个布尔值

  6、返回栈中元素数目,通过len()取列表的长度,即返回栈中元素的数目。

def size(self):
        return len(self.items)  # 返回栈中元素的数目,它不需要参数,且会返回一个整数

  代码实现

# 通过列表实现栈的操作(以列表尾部作为栈的顶端)
class Stack:
    def __init__(self):
        self.items = []  # 创建一个空栈,它不需要参数,且会返回一个空栈
        
    def isEmpty(self):
        return self.items == []  # 检查栈是否为空,它不需要参数,且会返回一个布尔值
        
    def push(self, item):
        self.items.append(item)  # 将一个元素添加到栈的顶端,它需要一个参数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)  # 返回栈中元素的数目,它不需要参数,且会返回一个整数


1.3 栈的应用

匹配圆括号

  我们知道圆括号由左括号“(”和右括号“)”进行匹配的,通过创建一个空栈来保存括号,从左至右依次处理括号,若匹配到左括号则通过push()方法将其添加至栈中,而若匹配到右括号则通过pop()方法删除栈顶元素,最后若所有括号都匹配则栈为空,程序会返回一个布尔值来表示括号是否匹配。
  程序完整代码及解析如下:

# 通过列表实现栈的操作(以列表尾部作为栈的顶端)
class Stack:
    def __init__(self):
        self.items = []  # 创建一个空栈,它不需要参数,且会返回一个空栈

    def isEmpty(self):
        return self.items == []  # 检查栈是否为空,它不需要参数,且会返回一个布尔值

    def push(self, item):
        self.items.append(item)  # 将一个元素添加到栈的顶端,它需要一个参数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)  # 返回栈中元素的数目,它不需要参数,且会返回一个整数


# 定义一个有参函数Par_Checker(),其参数parenthesis是输入的括号
def Par_Checker(parenthesis):
    s = Stack()  # s是一个新创建的空栈,创建一个对象
    balanced = True
    index = 0
    while index < len(parenthesis) and balanced:  # 若当前索引值小于输入的括号的总长度且变量balanced的值为正确时,一直执行while循环下去
        symbol = parenthesis[index]# 取输入的括号赋给变量symbol,变量index的初值为0
        if symbol == "(":  # 若匹配到左括号则通过push()方法将其添加至栈中
            s.push(symbol)
        else:
            if s.isEmpty():  # 检查栈是否为空,它不需要参数,会返回一个布尔值
                balanced = False  # 栈为空,变量balanced的值变为False
            else:
                s.pop()  # 若匹配到右括号则通过pop()方法删除栈顶元素
        index = index + 1  # 索引加一,对下一个括号进行检查
    if balanced and s.isEmpty():  # 如果栈为空,则代表所有括号都匹配成功
        return True
    else:
        return False


#测试
print(Par_Checker("(()(("))#false
print(Par_Checker(")(("))#false
print(Par_Checker("(()(()))"))#true

匹配符号

  通过改进匹配圆括号的程序从而实现对符号“()”、“[]”和“{}”的匹配,在原有的基础上加了一个函数matches(),该函数检查每一个从栈顶移除的符合是否与当前的右符合相匹配,匹配符号的程序完整代码及解析如下:

# 通过列表实现栈的操作(以列表尾部作为栈的顶端)
class Stack:
    def __init__(self):
        self.items = []  # 创建一个空栈,它不需要参数,且会返回一个空栈

    def isEmpty(self):
        return self.items == []  # 检查栈是否为空,它不需要参数,且会返回一个布尔值

    def push(self, item):
        self.items.append(item)  # 将一个元素添加到栈的顶端,它需要一个参数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)  # 返回栈中元素的数目,它不需要参数,且会返回一个整数


# 定义一个有参函数matches(),该函数检查每一个从栈顶移除的符合是否与当前的右符合相匹配
def matches(left, right):
    left = "([{"
    right = ")]}"
    return left.index(left) == right.index(right)  # index()用于检查子字符串是否在字符串中


# 定义一个有参函数Par_Checker(),其参数parenthesis是输入的括号
def Par_Checker(parenthesis):
    s = Stack()  # s是一个新创建的空栈,创建一个对象
    balanced = True
    index = 0
    while index < len(parenthesis) and balanced:  # 若当前索引值小于输入的符号的总长度且变量balanced的值为正确时,一直执行while循环下去
        symbol = parenthesis[index]  # 取输入的符号赋给变量symbol,变量index的初值为0
        if symbol in "([{":  # 若匹配到左符号则通过push()方法将其添加至栈中
            s.push(symbol)
        else:
            if s.isEmpty():  # 检查栈是否为空,它不需要参数,会返回一个布尔值
                balanced = False  # 栈为空,变量balanced的值变为False
            else:
                top = s.pop()  # 若匹配到右符号则通过pop()方法删除栈顶元素
                if not matches(top, symbol):  # 调用matches()函数检查每一个从栈顶移除的符合是否与当前的右符合相匹配,即若未匹配执行以下语句
                    balanced = False
        index = index + 1  # 索引加一,对下一个符号进行检查
    if balanced and s.isEmpty():  # 如果栈为空,则代表所有符号都匹配成功
        return True
    else:
        return False


#测试
print(Par_Checker("(({)("))
print(Par_Checker("]("))
print(Par_Checker("{([]})"))

模2除法(十进制转二进制)

  我们知道将十进制转二进制可以通过模2除法的方法实现,也就是除2取余,逆序排列,如下十进制25转换为二进制:

  我们从步骤上可以看出,计算出的第一个余数是得到结果的最后一位,而最后计算出的余数是结果的第一位,所以可以将得到的二进制数看成一系列数字,创建一个空栈,通过一系列方法得到二进制数字。
模2除法的程序完整代码及解析如下:

# 通过列表实现栈的操作(以列表尾部作为栈的顶端)
class Stack:
    def __init__(self):
        self.items = []  # 创建一个空栈,它不需要参数,且会返回一个空栈

    def isEmpty(self):
        return self.items == []  # 检查栈是否为空,它不需要参数,且会返回一个布尔值

    def push(self, item):
        self.items.append(item)  # 将一个元素添加到栈的顶端,它需要一个参数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)  # 返回栈中元素的数目,它不需要参数,且会返回一个整数


# 创建一个有参函数DivideBy2(),参数为一个十进制数
def DivideBy2(decNumber):
    s = Stack()  # s是一个新创建的空栈,创建一个对象
    while decNumber > 0:  # 若输入的十进制大于0,则执行while循环一直下去
        rem = decNumber % 2  # 参数rem为余数,即十进制数每次除2得到的余数
        s.push(rem)  # 通过push()方法将得到的余数添加到栈的顶端
        decNumber = decNumber // 2  # 输入的十进制整数除2,即十进制与2的整数商
    binString = ""  # 定义一个空字符串binString用于存放二进制数字
    while not s.isEmpty():  # 若栈不为空,则执行while循环一直下去
        binString = binString + str(s.pop())  # 通过pop()方法将栈顶的元素移除,通过str()转换为字符串类型并通过"+"拼接赋值给字符串binString
    return binString  # 得到的二进制值


print(DivideBy2(17))
print(DivideBy2(255))
print(DivideBy2(1024))
print(DivideBy2(2022))

进制转换

  根据十进制转二进制的程序代码可以进一步改进,首先该函数可以另外定义一个参数base,它表示相应的进制数(二进制、八进制、十六进制),另外创建一个字符串digits,由于有十进制转十六进制,所以该字符串的内容应该有ABCDEF,再加上数字0-9,即该字符串的内容为“0123456789ABCDEF”,它用于存储对应位置上的数字,当从栈中移除一个十进制余相应的进制数得到的余数时,就可以作为访问数字的下标,即对应的数字会被添加到结果中,最后再通过pop()方法将栈顶的元素移除,通过对字符串索引的方式依次索引移除的元素,并通过"+"拼接赋值给字符串newString。
  十进制转其他进制(二进制、八进制、十六进制)的程序完整代码及解析如下:

# 通过列表实现栈的操作(以列表尾部作为栈的顶端)
class Stack:
    def __init__(self):
        self.items = []  # 创建一个空栈,它不需要参数,且会返回一个空栈

    def isEmpty(self):
        return self.items == []  # 检查栈是否为空,它不需要参数,且会返回一个布尔值

    def push(self, item):
        self.items.append(item)  # 将一个元素添加到栈的顶端,它需要一个参数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)  # 返回栈中元素的数目,它不需要参数,且会返回一个整数


# 创建一个有参函数BaseConverter(),参数为进制数和进制
def BaseConverter(decNumber, base):
    digits = "0123456789ABCDEF"  # 创建一个字符串digits,存储对应位置上的数字,当从栈中移除一个余数时,它可以被用作访问数字的下标,对应的数字会被添加到结果中
    s = Stack()
    while decNumber > 0:  # 若输入的进制数大于0,则执行while循环一直下去
        rem = decNumber % base  # 参数rem为余数,即进制数每次除相应的进制得到的余数
        s.push(rem)  # 通过push()方法将得到的余数添加到栈的顶端
        decNumber = decNumber // base  # 输入的进制数整数除相应的进制
    newString = ""  # 定义一个空字符串newString用于存放二进制数字
    while not s.isEmpty():  # 若栈不为空,则执行while循环一直下去
        newString = newString + digits[s.pop()]  # 通过pop()方法将栈顶的元素移除,通过对字符串索引的方式依次索引移除的元素,并通过"+"拼接赋值给字符串newString
    return newString  # 得到的相应进制值


#测试
print(BaseConverter(17, 2))
print(BaseConverter(255, 8))
print(BaseConverter(1024, 16))
print(BaseConverter(2022, 16))

二、队列

  队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
  队列是一种先进先出的(First In First Out)的线性表,简称 FIFO。允许插入的一端为队尾,允许删除的一端为队头。队列不允许在中间部位进行操作!假设队列是q=(a1,a2,……,an),那么a1就是队头元素,而an是队尾元素。这样我们就可以删除时,总是从a1开始,而插入时,总是在队列最后。这也比较符合我们通常生活中的习惯,排在第一个的优先出列,最后来的当然排在队伍最后。

2.1 单向队列

  单向队列操作

  • enqueue(item) :往队列中添加一个item元素
  • dequeue(): 从队列头部删除一个元素
  • is_empty(): 判断一个队列是否为空
  • size(): 返回队列的大小

  同样地,这里也以 list 实现单向队列,当然你也可以使用链表实现。

class Queue(object):
    """创建一个空的队列"""

    def __init__(self):
        """
        用顺序表实现队列,Python 中 list 是顺序表
        队列:先进先出
        以列表尾部为队头(append:O(1),就要从列表头就是队列尾部(pop(0):O(n))
        以列表头部为队头(insert(0, item):O(n),就要从列表就尾是队列尾部(pop():O(1))
        所有哪种方法都可以
        """
        # 定义一个列表,用来存储元素
        self.__list = []

    def enqueue(self, item):
        """往队列中添加一个item元素"""
        self.__list.append(item)

    def dequeue(self):
        """从队列头部删除一个元素"""
        return self.__list.pop(0)

    def is_empty(self):
        """判断栈是否为空
        若 self.__list 为空,则为 False,
        [] 也是 False,两者为真,返回 True
        """
        return self.__list == []

    def size(self):
        """返回栈的元素个数"""
        return len(self.__list)


if __name__ == '__main__':
    q = Queue()
    print(q.is_empty())
    q.enqueue(1)
    q.enqueue(2)
    q.enqueue(3)

    print(q.size())
    print(q.is_empty())
    print(q.dequeue())
    print(q.dequeue())
    print(q.dequeue())

    print(q.is_empty())

2.2 双端队列

  双端队列(deque,全名double-ended queue),是一种具有队列和栈的性质的数据结构。
  双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。双端队列可以在队列任意一端入队和出队。
操作

  • add_front(item): 从队头加入一个item元素
  • add_rear(item) :从队尾加入一个item元素
  • remove_front() :从队头删除一个item元素
  • remove_rear(): 从队尾删除一个item元素
  • is_empty() :判断双端队列是否为空
  • size() :返回队列的大小
class Deque(object):
    """创建一个空的双端队列"""

    def __init__(self):
        """
        用顺序表实现栈,Python 中 list 是顺序表
        栈:先进先出
        以列表尾部为队头(append:O(1),就要从列表头就是队列尾部(pop(0):O(n))
        以列表头部为队头(insert(0, item):O(n),就要从列表就尾是队列尾部(pop():O(1))
        所有哪种方法都可以
        """
        # 定义一个列表,用来存储元素
        self.__list = []

    def add_front(self, item):
        """从队头加入一个item元素"""
        self.__list.insert(0, item)     # O(n)
        # self.__list.append(item)      # O(1)

    def add_rear(self, item):
        """从队尾加入一个item元素"""
        self.__list.append(item)        # O(1)
        # self.__list.insert(0, item)   # O(n)

    def remove_front(self):
        """从队头删除一个item元素"""
        return self.__list.pop(0)       # O(n)
        # return self.__list.pop()      # O(1)

    def remove_rear(self):
        """从队尾删除一个item元素"""
        return self.__list.pop()        # O(1)
        # return self.__list.pop(0)     # O(n)

    def is_empty(self):
        """判断栈是否为空
        若 self.__list 为空,则为 False,
        [] 也是 False,两者为真,返回 True
        """
        return self.__list == []

    def size(self):
        """返回栈的元素个数"""
        return len(self.__list)


if __name__ == '__main__':
    q = Deque()
    print(q.is_empty())
    q.add_front(1)      # 1
    q.add_front(2)      # 2 1
    q.add_rear(3)       # 2 1 3

    print(q.size())     # 3
    print(q.is_empty())     # False
    print(q.remove_front())     # 2
    print(q.remove_front())     # 1
    print(q.remove_rear())      # 3

    print(q.is_empty())         # True

2.3 队列的应用

验证回文串

  给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
  说明:本题中,我们将空字符串定义为有效的回文串。
  示例 1:
  输入: “A man, a plan, a canal: Panama”
  输出: true
  解释:“amanaplanacanalpanama” 是回文串

  示例 2:
  输入: “race a car”
  输出: false
  解释:“raceacar” 不是回文串

双端队列求解

import collections
class Solution:
    def isPalindrome(self, s):#s=str
        s = s.lower()
        # 检测字母与数字字符
        s = [i for i in s if i.isalpha() or i.isnumeric()]
        # 构造双端队列
        deque = collections.deque()
        # 回文词入对
        for i in s:
            deque.appendleft(i)
        state = True
        while len(deque) > 1 and state:
            left = deque.popleft()
            right = deque.pop()
            if left != right:
                state = False
        return state

滑动窗口最大值

  给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
  示例:
  输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
  输出: [3,3,5,5,6,7]

class Solution:

    # 方法二:双端队列
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        n = len(nums)
        q = collections.deque()
        # 先将k个元素生成单调递减队列
        for i in range(k):
            while q and nums[i] >nums[q[-1]]:
                q.pop()
            q.append(i)
        # 首个窗口的最大元素进列表
        res = [nums[q[0]]]
        # 再依次入单调递减队列
        for i in range(k,n):
            while q and nums[i]>nums[q[-1]]:
                q.pop()
            q.append(i)
            # 当队列长度超过k个,就弹出队首
            while q[0]<=i-k:
                q.popleft()
            res.append(nums[q[0]])
        return res

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1549254.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32的SPI通信介绍

SPI简介 SPI:串行外设接口,与IIC一样都是通用数据总线。四根通信线&#xff1a;SCK&#xff0c;MOSI&#xff08;DO&#xff09;&#xff0c;MISO&#xff08;DI&#xff09;&#xff0c;SS。同步&#xff08;共用一根时钟线&#xff09;&#xff0c;全双工&#xff08;数据发…

js算法记录

> 更多请前往 https://www.passerma.com/article/86 滑动窗口 1 给定一个矩阵&#xff0c;包含N*M个整数&#xff0c;和一个包含K个整数的数组。现在要求在这个矩阵中找一个宽度最小的子矩阵&#xff0c;要求子矩阵包含数组中所有的整数 function minSubmatrixWidth(mat…

Openstack创建和操作实例,实现与外部网络通信

一、熟悉OpenStack图形界面操作 1、了解Horizon项目 Horizon项目 各OpenStack服务的图形界面都是由Horizon提供的。Horizon提供基于Web的模块化用户界面。Horizon为云管理员提供一个整体的视图。Horizon为终端用户提供一个自主服务的门户。Horizon由云管理员进行管理与控制&a…

SpringBoot学习笔记一、SpringBoot应用初创建以及应用

一、创建SpringBoot的两种方式 1.Spring Initializr方式创建 &#xff08;1&#xff09;第一步在IDEA中选择 File-->NEW-->Project &#xff0c;选择 Spring Initializr &#xff0c;指定Maven坐标、包名、指定 JDK 版本 1.8 &#xff0c;然后点击Next 。如下图&#x…

修改Jupyter Notebook的默认路径,以及在PowerShell中自定义其启动路径

修改Jupyter Notebook的默认路径&#xff0c;以及在PowerShell中自定义其启动路径 设置 Jupyter Notebook 配置文件&#xff0c;修改默认路径要在PowerShell中设置自定义的启动脚本&#xff0c;以确保Jupyter Notebook能够自动定位到当前路径设置后的效果 在使用Jupyter Notebo…

遇到了问题,Firepower 2140配置带外IP时报错 commit-buffer failed

onsite we have a cisco firepower 2140 device which run ASA as we try to modify the 2140 OOB mgmt ip by CLI, we got an error why ? 经过查询发现&#xff0c;需要进入ASA里面打上以下这条命令&#xff0c;并重启ASA 1 修改模式并重启 ciscoasa# configure termina…

C语言例4-15:从键盘输入一个整数,求其绝对值并输出。

代码如下&#xff1a; //从键盘输入一个整数&#xff0c;求其绝对值并输出。 #include<stdio.h> int main(void) {int n;printf("输出一个整数&#xff1a; \n");scanf("%d",&n); //从键盘输入一个整数保存至变量nif(n<0) //…

Python爬虫之爬取网页图片

当我们想要下载网页的图片时&#xff0c;发现网页的图片太多了&#xff0c;无从下手&#xff0c;那我们写一个脚本来爬取呗。 这次的脚本是专门针对某个外国网站使用的&#xff0c;因此仅供参考思路。 在测试的过程中&#xff0c;我发现网站使用了发爬虫机制&#xff0c;具体就…

连接数据库(MySQL)的JDBC

目录 JDBC简介快速入门API详解DriverManager&#xff08;驱动管理类&#xff09;注册驱动&#xff1a;获取数据库连接(对象)&#xff1a; Connection&#xff08;数据库连接对象&#xff09;获取执行SQL的对象管理事务 Statement(执行SQL语句)执行DML、DDL语句执行DQL语句 Resu…

【LLM多模态】Cogvlm图生文模型结构和训练流程

note Cogvlm的亮点&#xff1a; 当前主流的浅层对齐方法不佳在于视觉和语言信息之间缺乏深度融合&#xff0c;而cogvlm在attention和FFN layers引入一个可训练的视觉专家模块&#xff0c;将图像特征与文本特征分别处理&#xff0c;并在每一层中使用新的QKV矩阵和MLP层。通过引…

LED基础知识分享(三)

大家好&#xff0c;我是砖一。 今天给大家分享一下&#xff0c;LED的基础知识&#xff0c;有照明行业&#xff0c;或者对LED感兴趣的朋友&#xff0c;可以学习一下&#xff0c;希望对你有用~ 一、热扩散 物质本身或当物质与物质接触时&#xff0c;能量的传递就被称为热传导&a…

STM32串口收发单字节数据原理及程序实现

线路连接&#xff1a; 显示屏的SCA接在B11&#xff0c;SCL接在B10&#xff0c;串口的RX连接A9&#xff0c;TX连接A10。 程序编写&#xff1a; 在上一个博客中实现了串口的发送代码&#xff0c;这里实现串口的接收代码&#xff0c;在上一个代码的基础上增加程序功能。 Seiral.…

idea使用git笔记

1.创建分支和切换分支 创建分支 切换分支 2.把新创建的分支提交到远程服务器上&#xff08;注&#xff1a;如果没有提交的&#xff0c;随便找个文件修改再提交&#xff09; (1)切换到要提交的分支&#xff0c;add (2)commit (3)push 3.在自己分支修改代码及提交到自己的远…

MySQL - 高阶语句(二)

目录 6. 子查询 操作&#xff1a; EXISTS 关键字 别名 as 7. 视图 理论&#xff1a; 操作&#xff1a; 视图的优缺点 8. NULL 值 9. union 联级 9.1 union &#xff08;合并后去重&#xff09; 9.2 union all (合并后不去重) 9.3 取非交集值 10. case 条件选择查…

阿里云服务器租用价格表-2024最新(附明细报价)

2024年阿里云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网aliyunfuwuqi.com整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新…

TCP重传机制详解——02SACK

文章目录 TCP重传机制详解——02 SACKSACK是什么&#xff1f;为什么要有SACK&#xff1f;实际场景抓包具体显示信息流程 实战抓包讲解SACK关闭场景下&#xff0c;三次重复ACK后会快速重传SACK打开但是不携带SACK块信息场景下&#xff0c;三次重复ACK也不会快速重传SACK打开并且…

YOLOv9改进策略:IoU优化 | Wasserstein Distance Loss,助力小目标涨点

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文独家改进&#xff1a;基于Wasserstein距离的小目标检测评估方法 Wasserstein Distance Loss | 亲测在多个数据集能够实现涨点&#xff0c;对小目标、遮挡物性能提升明显 &#x1f4a1;&#x1f4a1;&#x1f4a1;MS COCO和PASC…

性价比高一点的diy台式主机怎么搭配?

怎么搭配一台性价比高一点的台式机 建议&#xff1a; 选择合适的CPU和GPU。根据实际需求选择相对较新的CPU和GPU型号&#xff0c;以确保能够运行目标应用程序和游戏。 合理选择内存和存储。根据预算选择适当的内存和存储容量。8GB或16GB内存对于一般计算和游戏使用足够了&…

USART发送单字节数据原理及程序实现

硬件接线&#xff1a; 显示屏的SCA接在B11&#xff0c;SCL接在B10&#xff0c;串口的RX连接A9&#xff0c;TX连接A10。 新建Serial.c和Serial.h文件 在Serial.c文件中&#xff0c;实现初始化函数&#xff0c;等需要的函数&#xff0c;首先对串口进行初始化&#xff0c;只需要…

全国地质灾害点shp崩塌滑坡泥石流空间分布地质灾害详查等数据集

地质灾害是指在自然或者人为因素的作用下形成的&#xff0c;对人类生命财产造成的损失、对环境造成破坏的地质作用或地质现象。地质灾害在时间和空间上的分布变化规律&#xff0c;既受制于自然环境&#xff0c;又与人类活动有关&#xff0c;往往是人类与自然界相互作用的结果。…