深入解析队列实现栈:从数据结构本质到工程实践
1. 从一个面试题说起为什么“队列实现栈”值得深究如果你刷过一些算法题或者经历过技术面试大概率见过“用队列实现栈”这道题。乍一看这像是一个纯粹的“脑筋急转弯”或者算法技巧题很多人背下解法就过去了。但作为一个在工程和算法领域摸爬滚打多年的老手我想说这道题的价值远不止于应付面试。它背后隐藏着对数据结构本质的理解、对抽象能力的考验以及在特定资源约束下的架构设计思路。栈Stack和队列Queue是两种最基础、最核心的线性数据结构。栈是“后进先出”LIFO像一摞盘子你只能从最上面取放队列是“先进先出”FIFO像排队后来的人只能排在队尾。它们的核心操作接口都非常简洁栈主要是push入栈、pop出栈、peek查看栈顶队列主要是enqueue入队、dequeue出队、front查看队首。那么问题来了用“先进先出”的队列去模拟“后进先出”的栈这听起来就像是让一支纪律严明的队伍去表演杂技叠罗汉天然存在矛盾。但正是这种矛盾逼迫我们去深入思考数据结构的“行为”本质而不是死记硬背它们的“实现”形式。在实际开发中你可能会遇到一些特殊的场景比如底层系统只提供了队列这种线程安全的消息管道但你上层的业务逻辑恰好需要用栈的行为来处理任务例如需要最近提交的任务优先执行或者在某些内存访问模式受限的嵌入式环境中基于已有的队列硬件模块来构建栈的逻辑。理解这种“适配”和“转化”的能力是区分普通码农和资深工程师的关键之一。接下来我将彻底拆解用队列实现栈的几种经典思路不仅告诉你代码怎么写更会深入分析每种方法的时空复杂度、适用场景以及我在实际编码和面试中遇到的“坑”。我们会从最直观的双队列法开始深入到更巧妙的单队列法最后探讨一些工程化的扩展思考。目标是让你不仅知其然更能知其所以然下次遇到类似“用A实现B”的问题时能有一套自己的分析方法论。2. 核心思路拆解如何让“排队”变成“叠罗汉”要让队列表现出栈的行为关键在于我们如何操纵元素进入和离开队列的顺序。栈的核心是最后进去的元素最先出来。而队列默认是先进去的元素先出来。因此所有解决方案都围绕一个中心思想在每次插入新元素后通过队列的内部调整确保这个新元素能被下一次“取出”操作访问到也就是让它处于队列的“前端”。基于这个思想主要有两大实现路径双队列法和单队列法。双队列法逻辑清晰易于理解单队列法则更巧妙空间效率更高。我们逐一深入。2.1 方法一双队列法——主队与辅助队的“乒乓”操作这是最符合直觉的方法。我们维护两个队列通常称为q1主队列和q2辅助队列。q1始终试图模拟栈中元素的存储顺序而q2在每次push操作时充当临时搬运工。核心操作逻辑如下push(x)– 入栈操作新元素x首先进入空的辅助队列q2。然后将主队列q1中的所有元素依次出队并进入q2。这一步是关键经过这个操作后q2的队首元素就是刚刚加入的x而q1变成了空队列。最后交换q1和q2的引用。这样q1又重新成为了那个“栈”且栈顶元素x就在队首。pop()– 出栈操作直接从q1的队首执行dequeue操作即可。因为经过上述push操作调整后q1的队首永远对应栈顶。top()/peek()– 查看栈顶直接返回q1的队首元素但不移除。empty()– 判断栈空判断q1是否为空即可。为什么这样设计我们通过一个简单的推演来理解。假设依次入栈 A, B, C。入栈 Aq2 [A]q1为空交换后q1 [A]。入栈 Bq2 [B]将q1(A) 移入q2得到q2 [B, A]交换后q1 [B, A]。此时队首是 B栈顶队尾是 A栈底。入栈 Cq2 [C]将q1(B, A) 移入q2得到q2 [C, B, A]交换后q1 [C, B, A]。可以看到q1的队列顺序恰好是栈从顶到底的反序。出栈时直接取队首 C完全符合栈的 LIFO 特性。复杂度分析push(x)操作的时间复杂度是O(n)其中 n 是当前栈内元素个数。因为需要将主队列所有元素搬运一次。pop(),top(),empty()操作的时间复杂度都是O(1)。空间复杂度是O(n)因为需要两个队列来存储 n 个元素。实操心得与避坑点队列的选择在具体编码时你需要选择一个具体的队列实现。在面试或算法题中通常使用语言标准库提供的队列如 Java 的LinkedList或ArrayDequePython 的collections.dequeC的std::queue。确保你使用的dequeue操作是 O(1) 的。“交换”的技巧交换两个队列的引用比物理上移动所有元素高效得多。在代码中就是简单交换q1和q2的指针或引用。例如在 Python 中self.q1, self.q2 self.q2, self.q1。命名清晰将两个队列命名为main_queue和temp_queue比q1/q2更能体现意图提高代码可读性。边界条件实现pop()和top()时一定要先检查栈是否为空避免对空队列进行操作。2.2 方法二单队列法——队列内部的“旋转”艺术双队列法需要额外的辅助队列空间。能否只用一个队列就实现呢答案是肯定的而且思路非常巧妙。单队列法的核心在于在每次push新元素后将新元素之前的所有元素依次出队再入队从而让新元素移动到队首。核心操作逻辑如下push(x)– 入栈操作首先将新元素x直接入队。然后获取当前队列的大小记为size。这个size是加入x之后的总大小。接下来执行一个循环(size - 1)次将队首的元素出队然后立刻将其再次入队。经过这个“旋转”操作后新加入的x就被移动到了队列的队首位置。pop(),top(),empty()这三个操作和双队列法一样分别对应出队队首元素、查看队首元素、判断队列是否为空。为什么旋转size-1次我们同样用 A, B, C 入栈来演示。初始队列q []。push(A):q [A]。size1旋转0次。q [A]。push(B): 先入队q [A, B]。size2旋转1次将 A 出队再入队。q [B, A]。此时队首 B 是栈顶。push(C): 先入队q [B, A, C]。size3旋转2次第一次B 出队再入队q [A, C, B]。第二次A 出队再入队q [C, B, A]。最终队首 C 是栈顶。可以看到通过内部旋转我们始终让最后一次入队的元素停留在队首完美模拟了栈顶。复杂度分析push(x)操作的时间复杂度同样是O(n)因为需要旋转 n-1 个元素。pop(),top(),empty()操作的时间复杂度都是O(1)。空间复杂度是O(n)只使用了一个队列。两种方法对比与选型建议特性双队列法单队列法空间占用需要两个队列对象但峰值存储元素数仍是 n只需一个队列对象时间复杂度push为 O(n)其他为 O(1)push为 O(n)其他为 O(1)代码逻辑清晰易于理解和讲述更巧妙代码更简洁实际性能每次push涉及 n 次元素转移出队入队每次push涉及 n-1 次元素转移出队入队推荐场景适合教学、面试中逐步推导适合追求代码简洁、节省一个队列引用的场景注意虽然单队列法少用一个队列但两者的时间复杂度渐进符号相同。在实际的算法面试中面试官通常更关注你是否理解 O(n) 的push操作是不可避免的以及你能清晰阐述两种方法的原理。你可以优先阐述双队列法因为它逻辑更直白然后引出单队列法作为优化这会显得你思考更有层次。3. 从原理到代码手把手实现与细节打磨理解了核心思路我们来看看如何用代码将其严谨地实现。这里我选择用 Python 语言来演示因为它语法简洁能更清晰地表达逻辑。我们会实现单队列和双队列两个版本并讨论一些关键的实现细节。3.1 单队列法完整实现from collections import deque class MyStack: def __init__(self): 初始化你的栈数据结构。 这里使用 collections.deque 作为底层队列因为它的两端操作都是 O(1)。 self.q deque() def push(self, x: int) - None: 将元素 x 压入栈顶。 核心入队后将新元素之前的所有元素旋转到它后面。 # 1. 先记录当前队列大小即加入新元素前的栈大小 n len(self.q) # 2. 新元素入队 self.q.append(x) # 3. 将“旧”的 n 个元素依次出队再入队相当于把新元素顶到了队首 for _ in range(n): self.q.append(self.q.popleft()) def pop(self) - int: 移除并返回栈顶元素。 由于 push 操作已保证栈顶在队首直接出队即可。 if self.empty(): raise Exception(Stack is empty) return self.q.popleft() def top(self) - int: 获取栈顶元素但不移除。 if self.empty(): raise Exception(Stack is empty) return self.q[0] # 查看队首元素 def empty(self) - bool: 判断栈是否为空。 return len(self.q) 0代码细节剖析deque的选择Python 的list在头部插入删除 (pop(0),insert(0, x)) 是 O(n) 操作不适合模拟队列。collections.deque双端队列在两端进行追加和弹出操作都拥有 O(1) 的时间复杂度是实现队列的理想选择。push中的nn len(self.q)这行代码必须在self.q.append(x)之前执行。因为我们需要旋转的是新元素入队之前的那些“老”元素。如果放在之后n就包含了新元素自己循环次数会多一次导致逻辑错误。异常处理在pop和top中我们对空栈情况进行了检查并抛出异常。在实际工程中你可能需要根据上下文定义更具体的异常类型或返回一个特殊值如None。top的实现直接使用self.q[0]访问队首元素因为deque支持下标访问O(1)时间复杂度。这比先pop再push回去要高效。3.2 双队列法完整实现from collections import deque class MyStackTwoQueues: def __init__(self): 初始化使用两个 deque。 self.main_q deque() # 主队列始终模拟栈的状态 self.helper_q deque() # 辅助队列用于临时周转 def push(self, x: int) - None: 1. 新元素进入辅助队列。 2. 将主队列所有元素移入辅助队列。 3. 交换主辅队列角色。 # 新元素入辅助队 self.helper_q.append(x) # 将主队所有元素“搬运”到辅助队后面 while self.main_q: self.helper_q.append(self.main_q.popleft()) # 交换引用辅助队变主队主队已空变辅助队 self.main_q, self.helper_q self.helper_q, self.main_q def pop(self) - int: if self.empty(): raise Exception(Stack is empty) return self.main_q.popleft() def top(self) - int: if self.empty(): raise Exception(Stack is empty) return self.main_q[0] def empty(self) - bool: return len(self.main_q) 0两种实现的对比思考单队列法的push操作是在一个队列内部进行“旋转”而双队列法则是在两个队列之间“搬运”。从操作次数上看单队列法每次push执行n次出队入队n是旧元素个数双队列法也是n次。但双队列法多了一次“交换引用”的操作这个操作通常很快只是交换指针。在实际运行中两者的性能差异微乎其微选择哪一种更多是代码风格和清晰度的考量。4. 复杂度深潜与工程化思考我们已经知道了两种方法push是 O(n)其他操作是 O(1)。但面试官常常会追问“有没有办法让所有操作都变成 O(1)” 或者 “这个 O(n) 的push在什么场景下会成为瓶颈” 这部分我们就来深入探讨这些问题并延伸一些工程化的考量。4.1 为什么push操作必须是 O(n)这是一个根本性的问题。我们可以从“信息论”的角度来理解。队列是 FIFO栈是 LIFO。如果我们想用队列来“模拟”栈的完整行为包括push,pop,top并且要求所有操作都是 O(1)那就意味着我们能用 O(1) 的时间通过一个 FIFO 的接口变出一个 LIFO 的结果。这在理论上几乎是不可能的除非我们提前知道了所有操作序列那就不叫模拟了。更严谨地说如果我们有一个“黑盒”队列只提供enqueue和dequeue两个 O(1) 操作那么任何试图用固定次数的这些操作来保证下一个dequeue出来的是最后enqueue的元素的方案都需要至少 O(n) 的额外操作比如我们实现的旋转或搬运。这个 O(n) 的代价正是为了扭转 FIFO 的“天性”使其表现出 LIFO 的“行为”。所以O(n) 的push或 O(n) 的pop是这种模拟不可避免的成本。4.2 时空权衡能否让pop是 O(n) 而push是 O(1)当然可以这正是另一种对称的思路。我们让队列保持自然的 FIFO 顺序即先入队的元素在队首。那么push(x)直接enqueue到队尾O(1)。pop()为了取出栈顶即最后入队的元素我们需要把队列中除最后一个元素外的所有元素都出队再入队将最后一个元素“旋转”到队首然后出队它。这个操作是 O(n)。top()类似pop需要旋转找到最后一个元素查看后再恢复队列也是 O(n)。这种方案和我们的主流方案是“对称”的只是把 O(n) 的代价从push转移到了pop和top上。如何选择取决于你的使用场景。如果你的应用是“写多读少”频繁push偶尔pop那么让push为 O(1) 的方案更优。反之“读多写少”则适合我们之前讨论的方案。在面试中你可以主动提出这种变体展示你对问题不同维度的思考。4.3 工程化扩展线程安全与容量限制在实际的工程项目中如果真需要实现这样一个“队列栈”我们还需要考虑更多。线程安全如果多个线程会同时操作这个栈那么push,pop等操作必须是原子的。在 Python 中可以使用threading.Lock为每个方法加锁。但要注意锁的粒度会影响性能。一个粗糙的实现是为整个对象加一把大锁但更精细的设计可以考虑读写锁因为top()和empty()通常不修改数据。import threading class ConcurrentStack: def __init__(self): self.q deque() self._lock threading.RLock() # 可重入锁 def push(self, x): with self._lock: # ... 原有的 push 逻辑 def pop(self): with self._lock: # ... 原有的 pop 逻辑容量限制有界栈有时我们不想让栈无限增长。可以在初始化时设置一个maxsize在push前检查len(self.q) self.maxsize如果已满可以抛出异常或返回错误也可以设计成阻塞等待类似有界队列。泛型支持我们的示例只处理了整数。在强类型语言如 Java 或 Go 中你会使用泛型Generics来让这个栈支持任意类型T。迭代器支持为了方便遍历栈中元素从顶到底可以实现__iter__方法。注意由于底层是队列遍历顺序需要仔细处理。4.4 在面试中如何脱颖而出当面试官提出这个问题时他期待的不仅仅是正确的代码。他更想考察沟通能力你是否能先澄清问题“请问需要实现哪些接口”、“对时间复杂度有特别要求吗”。分析能力从最简单的想法开始“我可以用两个队列一个主队列一个辅助队列…”逐步优化“其实一个队列通过内部旋转也能实现”。对比能力主动分析两种方法的时间、空间复杂度并讨论pushO(1)/popO(n) 的变体。知识广度能否联系到实际应用场景“在某些消息队列中间件中可以通过这种模式实现优先级反转”或者提到线程安全等工程问题。代码严谨性边界条件检查、异常处理、清晰的变量命名。记住把解题过程变成一次技术对话而不是机械的背诵是获得高分的关键。5. 举一反三从“队列实现栈”到“栈实现队列”有来有往另一个经典的姊妹题是“用栈实现队列”。理解了本文的深层逻辑后解决那个问题就更容易了。其核心思想是使用两个栈一个作为输入栈in_stack一个作为输出栈out_stack。push时元素压入in_stack。pop或peek时如果out_stack为空则将in_stack中的所有元素依次弹出并压入out_stack。这样最早进入in_stack的元素就到了out_stack的栈顶。然后从out_stack弹出或查看即可。这个方案实现了摊还时间复杂度 O(1)的pop和peek。每个元素只会经历一次从in_stack到out_stack的转移。这比“队列实现栈”在时间复杂度上更优其根本原因在于栈是 LIFO两个栈一正一反正好可以模拟 FIFO而两个 FIFO 的队列模拟 LIFO 则必须付出 O(n) 的代价。通过对比这两个问题你能更深刻地体会到栈和队列这两种抽象数据类型的对称性与差异性。它们就像数据结构世界里的两种基本粒子通过不同的组合方式能演化出各种复杂的行为。掌握这些基础组合的奥秘是构建更复杂、高效算法与系统的基石。下次当你设计一个模块的接口时不妨想想我提供的“基础元件”是什么用户可能用它们组合出哪些我未曾预料到的模式这种思考正是工程师价值的体现。

相关新闻

从词向量到语义搜索:Embedding原理与工程实践全解析

从词向量到语义搜索:Embedding原理与工程实践全解析

在实际的自然语言处理、推荐系统和搜索排序项目中,我们经常听到“Embedding”这个词。它被用来将文本、图片甚至用户行为转换成一组高维向量,然后通过计算向量之间的距离来判断它们的相似度。听起来很神奇,但很多开发者在使用时,心…

2026/8/17 7:43:35 阅读更多 →
IntelliJ IDEA插件生态:从效率工具到人性化工作台的进阶指南

IntelliJ IDEA插件生态:从效率工具到人性化工作台的进阶指南

1. 项目概述:当开发工具遇上“摸鱼”哲学作为一名在开发一线摸爬滚打了十多年的老码农,我深知一个高效、舒适的开发环境对生产力和心情有多重要。我们每天有超过三分之一的时间与IDE(集成开发环境)为伴,IntelliJ IDEA作…

2026/8/17 7:01:07 阅读更多 →
从零搭建生产级RAG企业知识库:四层流水线工程实践

从零搭建生产级RAG企业知识库:四层流水线工程实践

最近在帮几个团队做内部知识库升级,发现一个很有意思的现象:很多人一提到“企业知识库RAG”,第一反应就是去找最新的框架、最炫的模型,然后一头扎进代码里。折腾几周后,要么是效果不稳定,要么是流程跑不通&…

2026/8/16 4:43:20 阅读更多 →

最新新闻

AI Agent技能治理:从元数据标准化到动态进化的工程实践

AI Agent技能治理:从元数据标准化到动态进化的工程实践

1. 从“技能爆炸”到“技能治理”:一个被忽视的Agent核心问题最近和几个做AI Agent的朋友聊天,大家不约而同地提到了同一个痛点:“技能仓库”越来越乱,根本没法用。一开始,我们都热衷于给Agent添加各种技能&#xff08…

2026/8/17 8:35:05 阅读更多 →
从原理到实战:Embedding模型如何驱动RAG系统实现精准语义检索

从原理到实战:Embedding模型如何驱动RAG系统实现精准语义检索

1. 项目概述:从文本到向量的核心桥梁 如果你最近在折腾大模型应用,尤其是想构建一个能“理解”你私有文档的智能问答系统,那么“Embedding 向量模型”这个词你一定绕不过去。它不像ChatGPT那样能直接和你对话,却是让机器真正“读懂…

2026/8/17 8:35:05 阅读更多 →
怀旧OC游戏运行指南:从RPG Maker到橙光游戏的兼容性解决方案

怀旧OC游戏运行指南:从RPG Maker到橙光游戏的兼容性解决方案

这次我们来看一个名为“【实况】来玩小时候做过的oc游戏?📢(附链接”的项目。从标题来看,这很可能是一个关于“OC游戏”的实况视频或分享,并附带了游戏链接。这里的“OC”在中文互联网语境下,通常指“原创角…

2026/8/17 8:35:05 阅读更多 →
AI应用开发:阻塞式与流式调用模式深度解析与实战指南

AI应用开发:阻塞式与流式调用模式深度解析与实战指南

1. 从“等待”到“流淌”:理解AI调用的两种范式 最近在折腾LangChain.js项目,想把一个简单的文本生成功能做得更丝滑。最开始,我直接用了最基础的 invoke 方法,用户输入问题,点击按钮,然后就是一段漫长的…

2026/8/17 8:35:05 阅读更多 →
持续学习评估新范式:从灾难性遗忘到动态性能矩阵

持续学习评估新范式:从灾难性遗忘到动态性能矩阵

在AI模型训练与部署的实践中,我们常常面临一个核心困惑:模型在训练集上表现优异,但在面对新数据或新任务时,其性能却可能急剧下降。这不禁让人质疑,模型是真的“学会”了通用能力,还是仅仅“记住”了训练数…

2026/8/17 8:35:05 阅读更多 →
彻底掌握数列求和:错位相减法与裂项相消法原理、应用与避坑指南

彻底掌握数列求和:错位相减法与裂项相消法原理、应用与避坑指南

在高中数学和大学数学分析中,数列求和是贯穿始终的核心技能。无论是处理等差数列、等比数列,还是更复杂的数列,直接逐项相加往往计算量巨大,甚至无法进行。此时,就需要借助一些巧妙的代数恒等变换,将复杂的…

2026/8/17 8:34:05 阅读更多 →

日新闻

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必修课? 如果你用LabVIEW做过稍微复杂点的项目,尤其是涉及界面响应、多任务并行或者硬件IO等待的场景,大概率遇到过这样的窘境:前面板点个按钮,整个程序就“卡死…

2026/8/17 0:00:08 阅读更多 →
LabVIEW异步调用实战:解决界面卡顿与并行处理难题

LabVIEW异步调用实战:解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必经之路如果你在LabVIEW里写过稍微复杂点的程序,尤其是涉及到界面响应、多任务并行或者硬件IO等待,大概率会遇到一个头疼的问题:程序“卡”住了。前面板点不动,进度条不更新…

2026/8/17 0:00:08 阅读更多 →
飞书局域网文件传输实战:3种方案实现高速点对点传输

飞书局域网文件传输实战:3种方案实现高速点对点传输

1. 项目概述:为什么要在局域网内用飞书传文件? 飞书作为一款主流的协同办公套件,其核心功能是围绕云端协作设计的。无论是文档、表格还是文件,通常的分享逻辑都是“上传到云端 -> 生成链接 -> 分享给同事”。这个流程在互联…

2026/8/17 0:00:08 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/17 2:58:27 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/17 2:58:30 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/17 2:58:32 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/16 6:00:23 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/16 6:00:24 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/16 6:00:27 阅读更多 →