数据结构与算法(3)栈与递归
1 栈的理解
-
栈是一个数据集合,可以理解为只能在一端进行插入或者删除操作的列表。
-
栈的特点:后进先出
-
栈的基本操作
-
- 进栈:push
- 出栈:pop
- 取栈顶:gettop
-
def brace_match(s): stack = [] d = {"(":")", "[":"]", "{":"}"} for ch in s: if ch in {'(','[','{'}: stack.append(ch) elif len(stack) == 0: print('多了右括号%s' % ch) return False elif d[stack[-1]] == ch: stack.pop() else: print('括号%s处不匹配' % ch) return False if len(stack) == 0: return True else: print('剩余括号未匹配') return False
2 队列的理解
队列的理解:
- 队列(queue)是一个数据集合,仅允许在列表一端进行插入,另一端进行删除。
- 进行插入的一端称为队尾(rear),插入动作被称为进队或者入队。
- 进行删除的一端称为队头(front),删除动作称为出队。
- 队列的性质:先进先出(first-in,first-out)
- 双向队列:队列两端都允许进行进队和出队操作
队列的内置模块:from collections import deque
- 创建队列:queue = deque(li)
- 进队:append
- 出队: popleft
- 双向队列首进队: appendleft
- 双向队列尾进队:pop
3 递归实现斐波那契函数
# 递归:
def my_num(x):
if x == 1:
return 1
elif x == 2:
return 2
else:
return my_num(x-2) + my_num(x-1)
for i in range(1, 10):
print(my_num(i))
4 车辆调度问题
def VehicleReecorder(Trucks, k):
BufferRails = []
for i in range(k):
BufferRails.append([])
currentCarriage = 1
for i in Trucks:
if i == currentCarriage:
print(f'{i}')
currentCarriage += 1
continue
else:
for buffer in BufferRails:
if not buffer:
buffer.append(i)
break
else:
if min(buffer) > i:
buffer.append(i)
break
for buffer_list in BufferRails:
for i in range(len(buffer_list)):
last = buffer_list.pop()
if last == currentCarriage:
print(f'{i}')
currentCarriage +=1
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用