数据结构之栈(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)}")
200 的 16进制数为:C8
254 的 4进制数为:3332
153 的 4进制数为:2121
29 的 4进制数为:131
108 的 16进制数为:6C
631 的 8进制数为:1167
892 的 8进制数为:1574
相关文章:

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

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

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

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

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

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

git 如何基于某个分支rebase?
文章目录 0. 概要1. 切换到你想要 rebase 的分支2. 执行 rebase 命令3. 解决冲突(如果有)4. 强制推送分支(如果已经推送过该分支) 0. 概要 之前介绍过如下git文章 git merge的三种操作merge, squash merge, 和rebase merge 如何使…...
倒序循环(一)
题目描述 输入一个正整数n,输出从 n~ 1 递减的序列。 输入格式 一行一个整数 n 输出格式 n 行,每行一个符合题目要求的整数 样例数据 样例输入#1 5样例输出#1 5 4 3 2 1样例输入#2 6样例输出#2 6 5 4 3 2 1数据范围 对于100%的数据ÿ…...

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…...

头条|司法部公法局局长访谈:推进高水平公立鉴定机构建设!加快推进司法鉴定立法!
主持人:大家好,我是司法部AI主播司政轩。为切实做好党的二十届三中全会精神学习宣传贯彻,积极反映司法部及地方司法行政机关学习全会精神的体会收获和贯彻落实举措,我们推出了“学习宣传贯彻党的二十届三中全会精神--司法行政微访…...

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

新产品,推出 MLX90372GVS 第三代 Triaxis® 位置传感器 IC,适用于汽车和工业系统(MLX90372GVS-ACE-308)
Triaxis 旋转和线性位置传感器IC: 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的智能家具管理系统(源代码+数据库+万字论文)
毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue的智能家具管理系统(源代码数据库万字论文)178 一、系统介绍 本项目前后端分离(可以改为ssm版本),分为用户、管理员两种角色 1、用户࿱…...

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

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

音视频入门基础:AAC专题(3)——AAC的ADTS格式简介
音视频入门基础:AAC专题系列文章: 音视频入门基础:AAC专题(1)——AAC官方文档下载 音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件 音视频入门基础:AAC…...

高可用web集群面经:集群搭建、nginx+keepalived高可用、prometheus+zabbix监控、nfs+dns
高可用web集群面经:集群搭建、nginxkeepalived高可用、prometheuszabbix监控、nfsdns 高可用web集群面经飞书在线链接🔗: (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加载天地图,加载地形,夸大地形 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 地址格式。字符串方式...

Python 二级考试
易错点 电脑基础知识 定义学生关系模式如下:Student (S#, Sn, Ssex,class,monitorS#)(其属性分别为学号、学生名、性别、班级和班长学号) 在关系模式中,如果…...

Linux笔记---简单指令
1. 使用的环境 博主使用的是华为云服务器xshell终端的方式学习的,因为据说这样的方式比较接近以后的工作环境。 其中云服务器安装的是Ubuntu操作系统(以Linux为内核,适合新手学习Linux的一个版本) 这里的云服务器不一定使用华为的,但是我在…...

软考无损连接判断
如何判断是否为无损连接,要看能否还原回最开始的关系模式 最开始的关系模式 U{A,B,C} 函数连接 F{A -> B},这个函数连接的意思就是A可以推导出B 首先从P1开始判断,{ AB,BC } C不能通过函数依赖推导出来…...

微服务-- Sentinel的使用
目录 Sentinel:微服务的哨兵 生态系统景观 sentinel与spring cloud Hystrix 对比 Sentinel 主要分为两部分 Sentinel安装与使用 Sentinel的控制规则 流控规则 流控规则的属性说明 新增流控规则 关联流控模式 SentinelResource注解的使用 SentinelResou…...

TS React 项目中使用TypeScript
在 React 项目中使用 TS 创建新项目 在现有项目中添加 TS 创建新项目 命令:npx create-react-app my-app --template typescript 说明:在命令行中,添加 --template typescript 表示创建支持 TS 的项目 项目目录的变化: 在项目…...

【JavaEE】IP协议 应用层协议
🔥个人主页: 中草药 🔥专栏:【Java】登神长阶 史诗般的Java成神之路 🕶️一.IP地址 IP协议(Internet Protocol)是TCP/IP协议族中最核心的协议之一,它定义了数据包在网络中传输的标准…...

CRM如何助力科技服务机构突破业务瓶颈?
在当今知识经济时代,科技服务机构面临着复杂的业务环境和多样化的客户需求。客户管理系统(CRM)在这个领域的应用正逐渐成为机构提升运营效率、优化客户服务的关键。 科技服务行业的业务特点 知识产权代理行业具有高度的专业性和复杂性。其业…...

牛啊,GitHub 代理加速图文教程
大家好,众所周知,GitHub 在国内访问速度堪忧,经常出现访问不了的情况,如果我们去 clone 代码,网速非常差。今天教大家如何给 GitHub 进行加速。 要用到我开发的开源项目 Cloudflare Workers Proxy,它是一个…...

基于扣子(Coze)打造第一个智能体——个性化对话机器人
文章目录 一,智能体体验二,动手打造一个自己的智能体1,主页点击创建机器人1.1 创建一个新的机器人1.2 修订Bot基础信息1.3 工具编排信息修订人设和回复逻辑、增补开场白等 2,使用插件优化机器人3,使用工作流优化机器人…...

算法-深度拷贝链表(138)
深度拷贝一个链表可以分以下几个步骤: 步骤 1:插入新节点 目标:在每个节点后面插入一个复制的节点。步骤: 遍历整个链表。对于每个节点 current,创建一个新节点 newNode,其值为 current.val。将 newNode …...