数据结构之栈(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 地址格式。字符串方式...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
