当前位置: 首页 > news >正文

数据结构之栈(python)

栈(顺序栈与链栈)

  • 1.栈存储结构
    • 1.1栈的基本介绍
    • 1.2进栈和出栈
    • 1.3栈的具体实现
    • 1.4栈的应用
      • 例一
      • 例二
      • 例三
  • 2.顺序栈及基本操作(包含入栈和出栈)
    • 2.1顺序栈的基础介绍
    • 2.2顺序栈元素`入栈`
    • 2.3顺序栈元素`出栈`
    • 2.4顺序栈的表示和实现
  • 3.链栈及基本操作(包含入栈和出栈)
    • 3.1链栈的基本介绍
    • 3.2链栈元素入栈
    • 3.3链栈元素出栈
    • 3.4链栈的表示和实现
  • 4.栈的应用
    • 4.1括号匹配问题
    • 4.2十进制转二进制
    • 4.3十进制转N进制

1.栈存储结构

  • 栈和队列,严格意义上来说,也属于线性表,因为它们也都用于存储逻辑关系为 一对一 的数据。使用栈结构存储数据,讲究“先进后出”,即最先进栈的数据,最后出栈
  • 使用队列存储数据,讲究 “先进先出”,即最先进队列的数据,也最先出队列。既然栈和队列都属于线性表,根据线性表分为顺序表链表的特点,也可分为顺序栈链栈队列也分为顺序队列链队列

1.1栈的基本介绍

顺序表链表一样,也是用来存储逻辑关系为 “一对一” 数据的线性存储结构,如图1所示:

在这里插入图片描述

  • 只能从表的一端存取数据另一端封闭
  • 中,无论是存数据还是取数据,都必须遵循"先进后出"的原则,即最先进栈的元素最后出栈
  • 图1来说,从图中数据的存储状态可判断出,元素 1最先进的栈。因此,当需要从栈中取出元素 1 时,根据"先进后出"的原则,需提前将元素 3元素 2 从栈中取出,然后才能成功取出元素 1
  • 我们可以给下一个定义,即是一种只能从表的一端存取数据且遵循 “先进后出” 原则的线性存储结构
  • 通常开口端被称为栈顶;相应地,封口端被称为栈底。因此,栈顶元素指的就是距离栈顶最近的元素,拿图2 来说,栈顶元素元素 4;同理,栈底元素指的是位于栈最底部的元素图2 中的栈底元素元素 1

在这里插入图片描述

1.2进栈和出栈

  • 添加元素,此过程被称为"进栈"(入栈压栈
  • 提取指定元素,此过程被称为"出栈"(或弹栈

1.3栈的具体实现

  • 顺序栈:采用顺序存储结构可以模拟栈存储数据的特点,从而实现栈存储结构
  • 链栈:采用链式存储结构实现栈结构

两种实现方式的区别,仅限于数据元素实际物理空间上存放的相对位置顺序栈底层采用的是数组链栈底层采用的是链表

1.4栈的应用

例一

我们经常使用浏览器各种网站上查找信息。假设先浏览页面 A,然后关闭了页面 A 跳转到页面 B,随后又关闭页面 B 跳转到了页面 C。而此时,我们如果想重新回到页面 A,有两个选择:

  • 重新搜索找到页面 A;
  • 使用浏览器的"回退"功能。浏览器会先回退页面 B,而后再回退到页面 A

浏览器 “回退” 功能的实现底层使用的就是栈存储结构。当你关闭页面 A 时,浏览器会将页面 A入栈;同样,当你关闭页面 B 时,浏览器也会将 B入栈。因此,当你执行回退操作时,才会首先看到的是页面 B,然后是页面 A,这是中数据依次出栈的效果。

例二

不仅如此,栈存储结构还可以帮我们检测代码中的括号匹配问题。多数编程语言都会用到括号小括号、中括号和大括号),括号错误使用(通常是丢右括号)会导致程序编译错误,而很多开发工具中都有检测代码是否有编辑错误功能,其中就包含检测代码中的括号匹配问题,此功能的底层实现使用的就是栈结构

例三

同时,栈结构还可以实现数值进制转换功能。例如,编写程序实现从十进制数自动转换成二进制数,就可以使用栈存储结构来实现。

2.顺序栈及基本操作(包含入栈和出栈)

2.1顺序栈的基础介绍

如果你仔细观察顺序表底层实现是数组)和栈结构就会发现,它们存储数据的方式高度相似,只不过对数据的存取过程有特殊的限制,而顺序表没有。

在这里插入图片描述
这里给出使用顺序表模拟栈存储结构常用的实现思路,即在顺序表中设定一个实时指向栈顶元素变量(一般命名为 top),top 初始值为 -1,表示中没有存储任何数据元素,及栈是"空栈"。一旦有数据元素,则 top 就做 +1 操作;反之,如果数据元素出栈top 就做 -1 操作。

2.2顺序栈元素入栈

模拟栈存储 {1,2,3,4}过程。最初,是"空栈",即数组的,top 值为初始值 -1,如图 3 所示:

在这里插入图片描述
首先向中添加元素 1,我们默认数组下标为 0 一端表示栈底,因此,元素 1 被存储在数组 a[1] 处,同时 top+1,如图 4 所示:

在这里插入图片描述
采用以上的方式,依次存储元素 2、3 和 4,最终,top 值变为 3,如图 5 所示:

在这里插入图片描述

2.3顺序栈元素出栈

其实,top 变量设置对模拟数据的 “入栈” 操作没有实际的帮助,它是为实现数据的 “出栈” 操作做准备的

在这里插入图片描述
注意图 6 数组中元素的消失仅是为了方便初学者学习,其实,这里只需要对 top 值做 -1 操作即可,因为 top本身就表示栈的栈顶位置,因此 top - 1等同于栈顶元素出栈。并且后期添加元素时,新元素会存储在类似元素 4 这样的旧元素位置上,将旧元素覆盖

2.4顺序栈的表示和实现

实现的基本功能:

  • 初始化空栈
  • 判断是否为
  • 返回栈顶元素
  • 返回栈的长度
  • 进栈
  • 出栈
  • 清空栈

代码实现

class sqStack:# 初始化栈def __init__(self, MAXSIZE):self.MAXSIZE = MAXSIZEself.data = [None] * self.MAXSIZEself.top = -1# 判断当前栈是否为空def is_empty(self):return self.top == -1# 返回栈顶元素def gettop(self):if self.is_empty():print("当前顺序栈为空")return Noneelse:return self.data[self.top]# 入栈def Push(self,item):# 判断栈是否满if self.top == self.MAXSIZE - 1:return "sqStack is full"self.data[self.top + 1] = itemself.top += 1# 列表入栈def ListPush(self,lst):# 判断栈是否满if self.top == self.MAXSIZE - 1:return "sqStack is full"for i in range(len(lst)):self.Push(lst[i])# 出栈def Pop(self):# 判断栈是否为空if self.is_empty():return "sqStack is empty"rs = self.data[self.top]self.top -= 1return rs# 计算栈的长度def size(self):return self.top + 1# 输出栈内元素def display(self):# 判断栈是否为空if self.is_empty():print("当前顺序栈为空", end=" ")else:print("当前链表元素为:", end="")for i in range(self.top + 1):print(self.data[i], end=" ")print()# 清空栈def clear(self):self.data = [None] * self.MAXSIZEself.top = -1# 初始化一个长度为20的顺序栈
s = sqStack(20)
print("初始化:", s)
print("----------------------")# 判断当前栈是否为空
print("当前栈是否为空:", s.is_empty())
print("----------------------")# 输出栈的元素
s.display()
print("----------------------")
print("入栈前栈内元素:",end="")
s.display()# 入栈
s.Push(1)
s.Push(10)
s.Push(100)# 输出当前栈内的元素
print("入栈后栈内元素:", end="")
s.display()
print("----------------------")
print("当前栈的长度为:", s.size())
print("----------------------")
print("队列入栈前栈内元素:", end="")
s.display()
s.ListPush([1,2,3,4])
print("队列入栈后栈内元素:", end="")
s.display()
print("----------------------")
print("当前栈顶元素为:",s.gettop())
print("----------------------")# 顶端元素出栈
print("出栈前栈内元素:",end="")
s.display()
print("出栈元素为:", s.Pop())
print("出栈后栈内元素:", end="")
s.display()
print("----------------------")#输出当前栈内的元素
s.display()
print("----------------------")
s.clear()
s.display()
print("----------------------")
初始化: <__main__.sqStack object at 0x000002A011B38460>
----------------------
当前栈是否为空: True
----------------------
当前顺序栈为空 
----------------------
入栈前栈内元素:当前顺序栈为空 
入栈后栈内元素:当前链表元素为:1 10 100 
----------------------
当前栈的长度为: 3
----------------------
队列入栈前栈内元素:当前链表元素为:1 10 100 
队列入栈后栈内元素:当前链表元素为:1 10 100 1 2 3 4 
----------------------
当前栈顶元素为: 4
----------------------
出栈前栈内元素:当前链表元素为:1 10 100 1 2 3 4 
出栈元素为: 4
出栈后栈内元素:当前链表元素为:1 10 100 1 2 3 
----------------------
当前链表元素为:1 10 100 1 2 3 
----------------------
当前顺序栈为空 
----------------------

3.链栈及基本操作(包含入栈和出栈)

3.1链栈的基本介绍

通常我们将链表头部作为栈顶尾部作为栈底

在这里插入图片描述
链表头部作为栈顶一端,可以避免在实现数据 “入栈” 和 “出栈” 操作时做大量遍历链表的耗时操作

  • 链表的头部作为栈顶,意味着:
    • 在实现数据"入栈"操作时,需要将数据链表头部插入
    • 在实现数据"出栈"操作时,需要删除链表头部首元节点

因此,链栈实际上就是一个只能采用头插法插入或删除数据的链表

3.2链栈元素入栈

例如,将元素 1、2、3、4 依次入栈等价于各元素采用头插法依次添加链表中,每个数据元素的添加过程如图 2 所示:

在这里插入图片描述

3.3链栈元素出栈

例如,图2 所示的链栈中,若要将元素 3 出栈,根据"先进后出"的原则,要先将元素 4 出栈,也就是从链表摘除,然后元素 3 才能出栈,整个操作过程如图 3 所示:

在这里插入图片描述

3.4链栈的表示和实现

实现基本功能:

  • 初始化空栈
  • 判断是否为
  • 返回栈顶元素
  • 进栈
  • 出栈
  • 清空栈

代码实现

# 定义链栈节点
class Node:# 初始化链栈def __init__(self, data):self.data = dataself.next = Noneclass linkstack:# 初始化链栈def __init__(self):self.top = None# 判断链栈是否为空def is_empty(self):return self.top == None# 清空链栈def clear(self):self.top = None# 返回当前栈的长度def size(self):i = 0tempnode = self.topwhile tempnode is not None:   # 从头开始遍历tempnode = tempnode.nexti += 1return i# 元素入栈def push(self, item):node = Node(item)node.next = self.topself.top = node# 栈顶元素出栈def pop(self):x = self.top.dataself.top = self.top.nextreturn x# 获取栈顶元素def gettop(self):return self.top.data# 输出当前栈内元素def display(self):if self.top == None:print("当前栈内元素为空", end="")else:print("当前栈内元素为:", end="")tempnode = self.topwhile tempnode is not None:print(tempnode.data, end=" ")tempnode = tempnode.nextprint()s1 = linkstack()
print("初始化的栈为:", s1)
print("------------------------")
print("入栈前的链栈元素为:", end="")
s1.display()
s1.push(1)
s1.push(2)
s1.push(3)
s1.push(4)
s1.push(5)
s1.push(6)
print("入栈后的链栈元素为:", end="")
s1.display()
print("------------------------")
print("当前栈顶元素为:",s1.gettop())
print("------------------------")
print("当前链栈的长度为:", s1.size())
print("------------------------")
print("出栈前的链栈元素为:", end="")
s1.display()
print("出栈元素为:", s1.pop())
print("出栈后的链栈元素为:", end="")
s1.display()
print("------------------------")
print("清空前的链栈元素为:", end="")
s1.display()
s1.clear()
print("清空后的链栈元素为:", end="")
s1.display()
print("------------------------")
print("当前链栈是否为空:", s1.is_empty())
print("------------------------")
初始化的栈为: <__main__.linkstack object at 0x0000023734D08460>
------------------------
入栈前的链栈元素为:当前栈内元素为空
入栈后的链栈元素为:当前栈内元素为:6 5 4 3 2 1 
------------------------
当前栈顶元素为: 6
------------------------
当前链栈的长度为: 6
------------------------
出栈前的链栈元素为:当前栈内元素为:6 5 4 3 2 1 
出栈元素为: 6
出栈后的链栈元素为:当前栈内元素为:5 4 3 2 1 
------------------------
清空前的链栈元素为:当前栈内元素为:5 4 3 2 1 
清空后的链栈元素为:当前栈内元素为空
------------------------
当前链栈是否为空: True
------------------------

4.栈的应用

4.1括号匹配问题

括号匹配问题:给一个字符串,其中包含小括号、中括号、大括号,求该字符串中的括号是否匹配

思路

  • 如果遇到左括号,都进栈;遇到右括号,查看栈顶是否为对应左括号,如果是对应左括号则该对应左括号出栈,如果是空栈false,如果是不对应左括号false。等遍历整个字符串后,查看是否为,如果为括号匹配成功,如果不为空括号匹配失败
# 定义顺序栈
class sqStack:# 初始化栈def __init__(self, MAXSIZE):self.MAXSIZE = MAXSIZEself.data = [None] * self.MAXSIZEself.top = -1# 判断当前栈是否为空def is_empty(self):return self.top == -1def gettop(self):if self.is_empty():print("当前顺序栈为空")return Noneelse:return self.data[self.top]# 入栈def Push(self, item):# 判断栈是否已满if self.top == self.MAXSIZE - 1:return "sqStack is full."self.data[self.top + 1] = itemself.top += 1# 列表入栈def ListPush(self, x):# 判断栈是否已满if self.top == self.MAXSIZE - 1:return "sqStack is full."for i in range((len(x))):self.Push(x[i])# 出栈def Pop(self):# 判断栈是否为空if self.is_empty():return "sqStack is empty"rs = self.data[self.top]self.top -= 1return rs# 输出栈的长度def size(self):return self.top + 1# 输出栈内元素def display(self):# 判断栈是否为空if self.is_empty():print("当前顺序栈为空", end=" ")else:print("当前链表元素为:", end="")for i in range(self.top + 1):print(self.data[i], end=" ")print()# 清空栈def clear(self):self.data = [None] * self.MAXSIZEself.top = -1def matching(strings):  # 输入是一串字符bktStack = sqStack(60)  # 创建类实例flag = 1opens = "{[("closes = "}])"# 对于每个输入字符for i in strings:# 遇到左括号,就将其压栈if i in opens:bktStack.Push(i)# 遇到右括号elif i in closes:# 若已没左括号与之匹配if bktStack.is_empty():# 不匹配,结束return False# 左括号按什么顺序入,右括号应按相反顺序消掉。# 如果匹配,右括号消的始终是栈顶括号。# 弹栈bktStack.pop(),判断栈顶左括号与当前右括号是否匹配if closes.index(i) != opens.index(bktStack.Pop()):# 不匹配,结束return False# 若一直没有return而是遍历了一遍,且没有多余左括号留在栈中,则说明匹配。反之不匹配。return bktStack.is_empty()# 判断返回的是True还是False
def check(strings):if matching(strings):print("%s 匹配正确!" % strings)else:print("%s 匹配错误!" % strings)if __name__ == "__main__":# 测试函数for i in range(4):stringa = input()check(stringa)
{{([][])}()}
{{([][])}()} 匹配正确!
[[{{(())}}]]
[[{{(())}}]] 匹配正确!
[[(()(()))])]{}
[[(()(()))])]{} 匹配错误!

4.2十进制转二进制

当将一个十进制整数M转换为二进制数时,在计算过程中,把M与2求余得到的二进制数的各位依次进栈,计算完毕后中的二进制数依次出栈输出,输出结果就是待求得的二进制数

测试案例:
[200, 254, 153, 29, 108, 631, 892]

运行结果

在这里插入图片描述
代码实现:

class sqStack:# 初始化栈def __init__(self, MAXSIZE):self.MAXSIZE = MAXSIZEself.data = [None] * MAXSIZEself.top = -1# 判断当前栈是否为空def is_empty(self):return self.top == -1# 返回栈顶元素def gettop(self):if self.is_empty():print("当前顺序栈为空")return Noneelse:return self.data[self.top]# 入栈def Push(self, item):# 判断栈是否已满if self.top == self.MAXSIZE - 1:return "sqStack is full"self.data[self.top + 1] = itemself.top += 1# 列表入栈def ListPush(self, x):# 判断栈是否已满if self.top == self.MAXSIZE - 1:return "sqStack is full"for i in range(len(x)):self.Push(x[i])# 出栈def Pop(self):# 判断栈是否为空if self.is_empty():return "sqStack is empty"rs = self.data[self.top]self.top -= 1return rs# 输出栈的长度def size(self):return self.top + 1# 输出栈内元素def display(self):# 判断栈是否为空if self.is_empty():print("当前顺序栈为空", end=" ")else:print("当前链表元素为:", end="")for i in range(self.top + 1):print(self.data[i], end=" ")print()# 清空栈def clear(self):self.data = [None] * self.MAXSIZEself.top = -1s = sqStack(20)
data = int(input("请输入十进制数:"))
while data != 0:ys = data % 2s.Push(ys)data = data // 2while s.top != -1:print(s.Pop(), end="")
请输入十进制数:200
11001000
请输入十进制数:254
11111110
请输入十进制数:153
10011001
请输入十进制数:29
11101
请输入十进制数:108
1101100
请输入十进制数:631
1001110111
请输入十进制数:892
1101111100

4.3十进制转N进制

当将一个十进制整数M转换为N进制数时,在计算过程中,把M与N求余得到的N进制数的各位依次进栈,计算完毕后将栈中N进制数依次出栈输出,输出结果就是待求得的N进制数

测试案例:

  • 测试数:[200, 254, 153, 29, 108, 631, 892]
  • 进制:[4, 8, 16]

自由搭配即可,这里我主要使用了random.choice()来对测试数要转换的进制随机取数

代码实现:

class sqStack:# 初始化栈def __init__(self, MAXSIZE):self.MAXSIZE = MAXSIZEself.data = [None] * MAXSIZEself.top = -1# 判断当前栈是否为空def is_empty(self):return self.top == -1# 返回栈顶元素def gettop(self):if self.is_empty():print("当前顺序栈为空")return Noneelse:return self.data[self.top]# 入栈def Push(self, item):# 判断栈是否已满if self.top == self.MAXSIZE - 1:return "sqStack is full"self.data[self.top + 1] = itemself.top += 1# 列表入栈def ListPush(self, x):# 判断栈是否已满if self.top == self.MAXSIZE - 1:return "sqStack is full"for i in range(len(x)):self.Push(x[i])# 出栈def Pop(self):# 判断栈是否为空if self.is_empty():return "sqStack is empty"rs = self.data[self.top]self.top -= 1return rs# 输出栈的长度def size(self):return self.top + 1# 输出栈内元素def display(self):# 判断栈是否为空if self.is_empty():print("当前顺序栈为空", end=" ")else:print("当前链表元素为:", end="")for i in range(self.top + 1):print(self.data[i], end=" ")print()# 清空栈def clear(self):self.data = [None] * self.MAXSIZEself.top = -1def divideByN(number, base):digits = "0123456789ABCDEF"remstack = sqStack(100)while number > 0:rem = number % baseremstack.Push(rem)number = number // basenewString = ""while not remstack.is_empty():newString = newString + digits[remstack.Pop()]return newStringimport random
numbers = [200,254,153,29,108,631,892]
bases = [4,8,16]
for number in numbers:base = random.choice(bases)print(f"{number} 的 {base}进制数为:{divideByN(number, base)}")
20016进制数为:C8
2544进制数为:3332
1534进制数为:2121
294进制数为:131
10816进制数为:6C
6318进制数为:1167
8928进制数为:1574

相关文章:

数据结构之栈(python)

栈&#xff08;顺序栈与链栈&#xff09; 1.栈存储结构1.1栈的基本介绍1.2进栈和出栈1.3栈的具体实现1.4栈的应用例一例二例三 2.顺序栈及基本操作&#xff08;包含入栈和出栈&#xff09;2.1顺序栈的基础介绍2.2顺序栈元素入栈2.3顺序栈元素出栈2.4顺序栈的表示和实现 3.链栈及…...

浅谈人工智能之基于HTTP方式调用本地QWen OPenAI接口(Java版)

浅谈人工智能之基于HTTP方式调用本地QWen OPenAI接口&#xff08;Java版&#xff09; 概述 Qwen是阿里云推出的一款超大规模语言模型&#xff0c;其强大的自然语言处理能力使其成为开发智能应用的热门选择。本文将指导你如何使用Java通过HTTP方式调用Qwen的OpenAI接口&#x…...

【python设计模式7】行为型模式2

目录 策略模式 模板方法模式 策略模式 定义一个个算法&#xff0c;把它们封装起来&#xff0c;并且使它们可以相互替换。本模式使得算法可独立于使用它的客户而变化。角色有&#xff1a;抽象策略、具体策略和上下文。 from abc import abstractmethod, ABCMeta from datetim…...

基于PHP的CRM管理系统源码/客户关系管理CRM系统源码/php源码/附安装教程

源码简介&#xff1a; 这是一款基于PHP开发的CRM管理系统源码&#xff0c;全称客户关系管理CRM系统源码&#xff0c;它是由php源码开发的&#xff0c;还附带了一整套详细的安装教程哦&#xff01; 功能亮点&#xff1a; 1、公海管理神器&#xff1a;不仅能搞定公海类型&…...

【乐企】基础版接口代码实现

本文主要是基础版接口声明的实现,具体接口声明见基础版接口声明。具体请求工具类见接口请求工具类 代码如下: 1、服务编码枚举 /*** User: yanjun.hou* Date: 2024/8/30 14:45* Description:乐企服务编码枚举...

题目--力扣----各位相加

给定一个非负整数 num&#xff0c;反复将各个位上的数字相加&#xff0c;直到结果为一位数。返回这个结果。 示例 1: 输入: num 38 输出: 2 解释: 各位相加的过程为&#xff1a; 38 --> 3 8 --> 11 11 --> 1 1 --> 2 由于 2 是一位数&#xff0c;所以返回 2。…...

git 如何基于某个分支rebase?

文章目录 0. 概要1. 切换到你想要 rebase 的分支2. 执行 rebase 命令3. 解决冲突&#xff08;如果有&#xff09;4. 强制推送分支&#xff08;如果已经推送过该分支&#xff09; 0. 概要 之前介绍过如下git文章 git merge的三种操作merge, squash merge, 和rebase merge 如何使…...

倒序循环(一)

题目描述 输入一个正整数n&#xff0c;输出从 n~ 1 递减的序列。 输入格式 一行一个整数 n 输出格式 n 行&#xff0c;每行一个符合题目要求的整数 样例数据 样例输入#1 5样例输出#1 5 4 3 2 1样例输入#2 6样例输出#2 6 5 4 3 2 1数据范围 对于100%的数据&#xff…...

Shell篇之编写apache启动脚本

Shell篇之编写apache启动脚本 1. 脚本编写 vim apache_ctl.sh#!/bin/bashfunction_start(){printf "Starting Apaache ...\n"/opt/lanmp/httpd/bin/apachectl start }function_stop(){printf "Stoping Apaache ...\n"/opt/lanmp/httpd/bin/apachectl s…...

头条|司法部公法局局长访谈:推进高水平公立鉴定机构建设!加快推进司法鉴定立法!

主持人&#xff1a;大家好&#xff0c;我是司法部AI主播司政轩。为切实做好党的二十届三中全会精神学习宣传贯彻&#xff0c;积极反映司法部及地方司法行政机关学习全会精神的体会收获和贯彻落实举措&#xff0c;我们推出了“学习宣传贯彻党的二十届三中全会精神--司法行政微访…...

高密原型验证系统解决方案(上篇)

0 引言 随着当今 SoC 设计规模的快速膨胀&#xff0c;仅仅靠几 颗当代最先进的 FPGA 已经无法满足原型验证的需求。简单的增加系统的容量&#xff0c;会遇到系统时钟复位同 步&#xff0c;设计分割以及高速接口和先进 Memory控制器 IP 验证等多重困难。此时&#xff0c;一个商用…...

新产品,推出 MLX90372GVS 第三代 Triaxis® 位置传感器 IC,适用于汽车和工业系统(MLX90372GVS-ACE-308)

Triaxis 旋转和线性位置传感器IC&#xff1a; MLX90372GVS-ACE-103 MLX90372GVS-ACE-108 MLX90372GVS-ACE-301 MLX90372GVS-ACE-200 MLX90372GVS-ACE-208 MLX90372GVS-ACE-303 MLX90372GVS-ACE-300 MLX90372GVS-ACE-350 MLX90372GVS-ACE-100 MLX90372GVS-ACE-101 MLX90372GVS-…...

JAVA毕业设计178—基于Java+Springboot+vue的智能家具管理系统(源代码+数据库+万字论文)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue的智能家具管理系统(源代码数据库万字论文)178 一、系统介绍 本项目前后端分离(可以改为ssm版本)&#xff0c;分为用户、管理员两种角色 1、用户&#xff1…...

掌握 Python 异步上下文管理器

在现代编程中&#xff0c;异步编程已成为处理并发任务的重要手段&#xff0c;特别是在 I/O 密集型应用中。Python 的 asyncio 库提供了强大的工具来编写异步代码。在异步编程中&#xff0c;上下文管理器&#xff08;context manager&#xff09;扮演着资源管理的关键角色。本文…...

当你问AI“有点烦”

感到烦躁是很正常的情绪反应&#xff0c;生活中总会有各种各样的压力和挑战让我们感到不安或不舒服。以下是一些建议&#xff0c;希望能帮助你缓解烦躁的情绪&#xff1a; 深呼吸&#xff1a;尝试进行几次深呼吸&#xff0c;这有助于放松身体和减缓心跳&#xff0c;让你的思维从…...

音视频入门基础:AAC专题(3)——AAC的ADTS格式简介

音视频入门基础&#xff1a;AAC专题系列文章&#xff1a; 音视频入门基础&#xff1a;AAC专题&#xff08;1&#xff09;——AAC官方文档下载 音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件 音视频入门基础&#xff1a;AAC…...

高可用web集群面经:集群搭建、nginx+keepalived高可用、prometheus+zabbix监控、nfs+dns

高可用web集群面经&#xff1a;集群搭建、nginxkeepalived高可用、prometheuszabbix监控、nfsdns 高可用web集群面经飞书在线链接&#x1f517;&#xff1a; (https://h03yz7idw7.feishu.cn/wiki/Ucj1wWZCGiqR68kripMcC2CLnvd)...

vue3+ts+supermap iclient3d for cesium功能集合

会把各项功能链接放在这 1.vue3配置supermap iclient3d for cesium vue3中使用supermap icilent3d for cesium_npm 引入supermapgis-CSDN博客 2.功能 2.1加载天地图&#xff0c;加载地形&#xff0c;夸大地形 supermap icilent3d for cesium加载地形并夸大地形-CSDN博客 …...

【案例71】配置https之后 IE打不开登陆页面 Uclient没有问题

问题现象 配置https之后 IE打不开登陆页面 Uclient没有问题。 jvm控制台 显示如下 basic: 已调整小应用程序大小且已将其添加到父容器中 basic: PERF: AppletExecutionRunnable - applet.init() BEGIN ; jvmLaunch dt 170755 us, pluginInit dt 722531 us, TotalTime: 89328…...

ROS 设置dhcp option 6 多个地址格式

ROS routeOS 手工设置 dhcp 服务 option 6 多个dns 地址格式。字符串方式...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...