1. 栈与队列基础概念解析栈和队列是计算机科学中最基础的两种线性数据结构它们的核心区别在于数据元素的进出顺序。栈遵循LIFOLast In First Out原则就像我们叠放的一摞盘子最后放上去的盘子总是最先被取用。而队列则遵循FIFOFirst In First Out原则类似于现实生活中的排队场景先来的人先获得服务。栈的典型操作包括push将元素压入栈顶pop弹出栈顶元素peek查看栈顶元素而不移除isEmpty判断栈是否为空队列的基本操作则包括enqueue元素入队添加到队尾dequeue元素出队从队首移除front获取队首元素isEmpty判断队列是否为空在算法面试中栈和队列的应用场景非常广泛。栈常用于解决括号匹配、表达式求值、函数调用栈等问题而队列则常用于BFS广度优先搜索、缓存实现、任务调度等场景。2. 双端队列与滑动窗口技术双端队列Deque是队列的增强版本它允许在队列的两端进行插入和删除操作。这种特性使得双端队列成为实现滑动窗口算法的理想数据结构。滑动窗口算法主要用于解决数组/字符串的子元素问题它通过维护一个窗口通常是固定大小的子数组在数据结构上滑动从而避免不必要的重复计算。以下是滑动窗口算法的三个典型应用场景2.1 滑动窗口最大值问题LeetCode 239题要求找出每个滑动窗口中的最大值。暴力解法时间复杂度为O(nk)而使用双端队列可以将复杂度优化到O(n)。关键思路是维护一个存储可能成为窗口最大值的元素索引的双端队列from collections import deque def maxSlidingWindow(nums, k): res [] q deque() for i, num in enumerate(nums): # 移除超出窗口范围的元素 if q and q[0] i - k: q.popleft() # 维护队列单调递减 while q and nums[q[-1]] num: q.pop() q.append(i) # 当窗口形成后开始记录结果 if i k - 1: res.append(nums[q[0]]) return res2.2 无重复字符的最长子串LeetCode 3题要求找出不包含重复字符的最长子串长度。滑动窗口配合哈希集合可以高效解决def lengthOfLongestSubstring(s): char_set set() left 0 max_len 0 for right in range(len(s)): while s[right] in char_set: char_set.remove(s[left]) left 1 char_set.add(s[right]) max_len max(max_len, right - left 1) return max_len2.3 长度最小的子数组LeetCode 209题要求找到和≥target的长度最小的连续子数组def minSubArrayLen(target, nums): left total 0 min_len float(inf) for right in range(len(nums)): total nums[right] while total target: min_len min(min_len, right - left 1) total - nums[left] left 1 return min_len if min_len ! float(inf) else 03. 栈的经典应用场景3.1 括号匹配问题栈是解决括号匹配问题的天然数据结构。当遇到左括号时压栈遇到右括号时弹出栈顶元素检查是否匹配def isValid(s): stack [] mapping {): (, }: {, ]: [} for char in s: if char in mapping: top stack.pop() if stack else # if mapping[char] ! top: return False else: stack.append(char) return not stack3.2 表达式求值栈可以用于处理中缀表达式的求值问题。需要两个栈分别处理操作数和运算符def calculate(s): def precedence(op): return {:1, -:1, *:2, /:2}.get(op, 0) nums [] ops [] i 0 while i len(s): if s[i] : i 1 continue if s[i].isdigit(): num 0 while i len(s) and s[i].isdigit(): num num * 10 int(s[i]) i 1 nums.append(num) else: while ops and precedence(ops[-1]) precedence(s[i]): applyOp(nums, ops) ops.append(s[i]) i 1 while ops: applyOp(nums, ops) return nums.pop() def applyOp(nums, ops): b, a nums.pop(), nums.pop() op ops.pop() if op : nums.append(a b) elif op -: nums.append(a - b) elif op *: nums.append(a * b) elif op /: nums.append(a // b)4. 队列的进阶应用与优化4.1 循环队列实现循环队列解决了普通队列在出队后空间浪费的问题。关键点在于使用模运算处理队尾指针class CircularQueue: def __init__(self, k): self.queue [None] * k self.head self.tail -1 self.size k def enQueue(self, value): if self.isFull(): return False if self.isEmpty(): self.head 0 self.tail (self.tail 1) % self.size self.queue[self.tail] value return True def deQueue(self): if self.isEmpty(): return False if self.head self.tail: self.head self.tail -1 else: self.head (self.head 1) % self.size return True def Front(self): return -1 if self.isEmpty() else self.queue[self.head] def Rear(self): return -1 if self.isEmpty() else self.queue[self.tail] def isEmpty(self): return self.head -1 def isFull(self): return (self.tail 1) % self.size self.head4.2 优先队列与堆的应用优先队列是队列的变种元素按照优先级出队而非插入顺序。通常用堆实现import heapq def findKthLargest(nums, k): heap [] for num in nums: heapq.heappush(heap, num) if len(heap) k: heapq.heappop(heap) return heap[0]4.3 单调队列的特殊应用单调队列可以高效解决滑动窗口极值问题。与双端队列不同它维护队列元素的单调性class MonotonicQueue: def __init__(self): self.q [] def push(self, n): while self.q and self.q[-1] n: self.q.pop() self.q.append(n) def max(self): return self.q[0] def pop(self, n): if n self.q[0]: self.q.pop(0)5. 算法刷题实战技巧5.1 栈与队列的选择策略选择数据结构时考虑需要后进先出处理 → 栈需要先进先出处理 → 队列需要两端操作 → 双端队列需要快速获取极值 → 单调栈/队列5.2 边界条件处理经验常见边界条件包括空输入处理单个元素情况全相同元素情况极端大/小值情况重复元素处理5.3 复杂度优化思路优化方向空间换时间使用辅助数据结构存储中间结果双指针技巧减少不必要的遍历预处理数据提前计算部分结果剪枝策略提前终止不可能的分支5.4 调试与验证方法有效调试技巧打印关键变量状态使用小规模测试用例验证边界条件对比暴力解法的结果可视化数据结构变化过程在实际刷题过程中建议先从基础问题入手逐步过渡到综合应用。例如先掌握栈的基本操作再尝试解决括号匹配问题最后挑战表达式求值等复杂场景。对于队列可以从基本BFS开始逐步学习滑动窗口和单调队列等高级技巧。
企业数字化 ERP 产品动态
相关推荐
C#控件与组件模型:WinForms自定义控件与无界面组件实践 1. 先把概念掰开:控件和组件到底差在哪"C#中的控件和组件"这个题目,很多人第一反应是"这不就是拖到窗体上的那些东西吗"。我早年也这么想,直到第一次被问到"为什么 Timer 能拖到窗体上却看不见"、"为什么… · 2026/11/5 1:47:31
企业级智能文档助手:技术架构与可视化编排实践 1. 项目概述:企业级技术文档助手的核心价值技术文档是企业知识资产的核心载体,但传统文档管理存在三大痛点:查找效率低(平均每个技术问题需翻阅6.8份文档)、维护成本高(每次产品迭代需更新23%的文档内容&am… · 2026/11/5 4:00:48
具身机器人端侧推理引擎实测:Agentic native架构下的300毫秒闭环 最近大半年,我一直在折腾一套东西:把具身机器人的大脑从云端往机器人本体上搬。说白了,就是让机械臂和轮式底盘在"不联网、不依赖服务器"的条件下,自己完成感知、规划、操作这一整条链路。上周我把一套Agentic native架… · 2026/11/5 1:25:28
基于Hadoop+Spark的民宿智能推荐系统设计与实现 1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享… · 2026/11/5 14:59:25
ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
UART接口24位ADC搭配RS485,解决远距离温度监控难题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
GD32E10x官方例程入门:从GPIO点灯到串口调试 简介:这份GD32E10x系列官方例程面向嵌入式硬件与单片机开发者,基于ARM Cortex-M3内核,汇集兆易创新GD32E10x的示例代码,适合工业控制、消费电子、通信设备等场景的学习、验证与二次开发。压缩包共935个文件,约11.16MB&… · 2026/11/5 13:52:29
基于Django的运维平台实战:资产、发布、巡检、告警一体化 简介:这份资源是一套基于Django框架开发的运维平台源码,面向具备Python基础、希望了解Web运维系统实现思路的开发者与运维人员,可用于学习主机管理、服务监控、日志查看、任务调度、权限控制、资源统计、脚本执行与故障告警等常见运维模块的落… · 2026/11/5 13:49:27
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07