news 2026/10/9 4:09:22

Vue3项目web-view中wx.miniProgram.navigateTo跳转指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue3项目web-view中wx.miniProgram.navigateTo跳转指南

做 Vue3 项目的朋友,早晚会遇到一个有点微妙的场景:H5 页面被塞进小程序的 web-view 容器里,点个按钮要从小程序内部跳转到某个业务页面。我在公司后台管理系统里接这个需求时,第一反应是直接调微信官方 JS-SDK 的wx.miniProgram.navigateTo(),结果真机一测就开始连环踩坑:按钮没反应、跳过去白屏、路径报错、tabBar 页面跳不了……网上资料又多又杂,很多还停留在公众号网页跳小程序的wx.openMiniProgram老用法,照着抄根本走不通。这篇就按我一整轮实践下来的经验,把 Vue3 项目里正确调用wx.miniProgram.navigateTo跳转指定小程序页面的前置条件、封装方法、参数细节和排查思路完整过一遍,给正准备接这个需求的同学省点时间。

1. 先分清宿主环境:你的 Vue3 页面到底跑在哪里

1.1 三种常见宿主,决定你该用哪个 API

微信生态里的 H5 页面,看起来都是在微信里打开,实际上宿主环境完全不同,能调的 API 也完全不一样。我把它们分成三类:

宿主环境典型入口wx.miniProgram 是否可用跳小程序该用哪个 API
普通微信浏览器 WebView聊天窗口直接打开链接、扫普通二维码不可用URL Scheme / URL Link,或引导用户复制链接
公众号网页公众号菜单、图文内嵌页、公众号内打开的链接不可用wx.openMiniProgram,需先wx.config鉴权
小程序 web-view 内嵌页小程序页面里的<web-view>组件承载的 H5可用wx.miniProgram.navigateTo等系列 API

这个区别是第一道分水岭。很多教程把公众号网页的场景直接套到 web-view 场景里,导致你明明照做了,wx.miniProgram依然是undefined。原因很简单:wx.miniProgram这个对象,是小程序 web-view 容器主动注入给 H5 页面的桥接对象,你不在这个容器里,它就不存在。普通微信浏览器里的 H5 拿到的wx是公众号网页版 JSSDK,里面压根没有miniProgram命名空间。

所以接到需求的第一件事,不是急着写跳转代码,而是先问自己一句:这个 Vue3 项目最终会被放在哪个容器里跑?如果答案是"小程序 web-view",那恭喜,wx.miniProgram.navigateTo就是正解;如果答案是"公众号网页"或者"普通 H5 链接",那请直接跳到第 5 章看替代方案。

1.2 写一个环境判定函数,别靠猜

判断当前页面到底跑在哪里,不要靠"我猜用户是在小程序里打开的",写一个工具函数一劳永逸:

// src/utils/env.js export function getWechatEnv() { const ua = navigator.userAgent.toLowerCase() if (!/micromessenger/i.test(ua)) { return 'browser' // 不在微信里 } if (/miniProgram/i.test(ua)) { return 'mini-program-webview' // 微信小程序 web-view 容器 } return 'wechat-webview' // 微信内置浏览器/公众号网页 }

这段代码的核心判断依据是 UA 字符串里的两个关键字:MicroMessenger表示微信浏览器,miniProgram表示当前正处于小程序 web-view 容器内。真机上这两个关键字都会出现在 UA 里,微信开发者工具里调试时也会带上,可以放心用。

为什么要单独做这个判断?因为wx.miniProgram.navigateTo在非小程序 web-view 环境下调用,大概率是静默失败的——不报错、不跳转、控制台也不打任何东西,特别容易让排查陷入僵局。有了环境判断,你可以在调用前直接拦一道,给用户一个明确提示:

const env = getWechatEnv() if (env !== 'mini-program-webview') { // 提示用户:请从小程序入口进入 showToast('当前环境不支持跳转') return }

1.3 wx.miniProgram 不需要 wx.config,别再被老教程带偏

公众号网页跳小程序时,wx.openMiniProgram必须在wx.config鉴权成功之后才能调用,这是公众号 JSSDK 的规矩。但 web-view 里的wx.miniProgram.navigateTo完全不需要走wx.config这套鉴权流程。

原因在于:小程序 web-view 容器在加载 H5 页面时,已经把wx.miniProgram对象直接注入到了页面全局,它相当于小程序给 H5 开的一扇后门,只要 H5 页面里能拿到这个对象,就能直接调用,不用向公众号后台验签。我自己第一次接的时候也被带偏了,在代码里先写了一套wx.config流程,结果config一直报签名错误,浪费时间不说,最后发现根本不是必须步骤。

这个点一定要记住:在 web-view 场景里,JS-SDK 文件照常引入,但不需要配置签名;真正需要配置签名的,是公众号网页场景下的wx.openMiniProgram。如果你在 web-view 里发现wx.miniProgram是undefined,问题出在引入方式或者容器环境上,而不是签名配置。

2. Vue3 工程接入微信 JS-SDK:导入姿势与工具封装

2.1 npm 包引入的两个坑

Vue3 项目接入微信 JS-SDK,最常见的方式当然是 npm 安装:

npm install weixin-js-sdk

然后组件里直接:

import wx from 'weixin-js-sdk'

这里第一个坑就来了:.js-sdk这个包的导出方式比较特殊,在某些版本和构建工具组合下,import wx from 'weixin-js-sdk'拿到的wx对象里miniProgram是undefined,但wx.config这些公众号接口却存在。你明明用了官方包,却找不到miniProgram,很容易误判成"当前不在 web-view 环境"。

排查办法很简单,先打印一下:

console.log('wx对象', wx) console.log('wx.miniProgram', wx && wx.miniProgram)

如果wx对象存在但wx.miniProgram为undefined,大概率是模块导出兼容问题。试试按下面这种方式兜底:

import * as wxModule from 'weixin-js-sdk' const wx = (wxModule.default || wxModule) as any

第二个坑和 Vue3 的构建环境有关。如果项目用了 SSR 或者在 Node 环境做预渲染,直接在模块顶层import wx from 'weixin-js-sdk'可能在构建时就报错,因为 JSSDK 内部引用了window。这种场景下要把 SDK 的加载动作放到浏览器运行时去做,也就是动态加载。

2.2 用 CDN 动态加载,web-view 场景里最省心

我在实际项目里最终的选型,是放弃 npm 包,直接从微信官方 CDN 加载jweixin-1.6.0.js。原因有三个:

  • 官方 CDN 文件小、加载快,且永远保持最新;
  • 绕开了 npm 包模块导出的兼容问题;
  • 在 web-view 场景下不需要wx.config,所以 CDN 引入没有任何鉴权前置成本。

写一个通用的动态加载函数:

// src/utils/wechatSdk.ts type WechatSdk = any let sdkPromise: Promise<WechatSdk> | null = null export function loadWechatSdk(): Promise<WechatSdk> { if (window.wx) { return Promise.resolve(window.wx) } if (sdkPromise) { return sdkPromise } sdkPromise = new Promise((resolve, reject) => { const script = document.createElement('script') script.src = 'https://res.wx.qq.com/open/js/jweixin-1.6.0.js' script.async = true script.onload = () => resolve(window.wx) script.onerror = () => { sdkPromise = null reject(new Error('微信 JS-SDK 加载失败')) } document.head.appendChild(script) }) return sdkPromise }

注意sdkPromise这个变量的作用:多个组件同时触发跳转时,不会重复注入同一个 script,避免重复加载导致的问题。第一次加载失败后把sdkPromise重置为null,这样用户再次点击按钮还有机会重试。

2.3 封装一个统一的跳转工具函数

不要把wx.miniProgram.navigateTo散落在各个组件的业务代码里,统一封装一次,后续所有跳转都走同一个入口,这样维护成本最低。我封装的时候会把环境判断、SDK 加载、Promise 化处理都塞进去:

// src/utils/miniProgram.ts import { loadWechatSdk } from './wechatSdk' import { getWechatEnv } from './env' interface JumpOptions { url: string extraData?: Record<string, unknown> } export function jumpToMiniProgram(options: JumpOptions): Promise<any> { return loadWechatSdk().then((wx: any) => { const env = getWechatEnv() if (env !== 'mini-program-webview') { return Promise.reject(new Error('NOT_IN_MINI_PROGRAM_WEBVIEW')) } if (!wx.miniProgram || typeof wx.miniProgram.navigateTo !== 'function') { return Promise.reject(new Error('MINI_PROGRAM_BRIDGE_NOT_READY')) } return new Promise((resolve, reject) => { wx.miniProgram.navigateTo({ url: options.url, extraData: options.extraData || {}, success: resolve, fail: (err: any) => { console.error('[miniProgram] navigateTo 失败:', err) reject(err) }, }) }) }) }

封装成 Promise 之后,组件里调用就很清爽了:

<script setup lang="ts"> import { jumpToMiniProgram } from '@/utils/miniProgram' const goOrderDetail = (orderId: string) => { jumpToMiniProgram({ url: `/pages/order/detail?id=${orderId}`, extraData: { source: 'h5_order_list' }, }).catch((err) => { // 统一错误提示,比如 Toast('跳转失败,请稍后重试') console.log('跳转失败', err) }) } </script>

这里有个小经验:不要直接裸调wx.miniProgram.navigateTo而不处理 fail 回调。这个 API 的 fail 很容易被触发,一旦触发你又没接管,用户点击后毫无反应,看起来就像一个 bug。Promise 化的意思不是让代码多优雅,而是强制你处理失败分支。

3. 调用过程的核心参数:url、extraData 与路由方式的选择

3.1 url 到底该怎么拼,三种常见错误写法

wx.miniProgram.navigateTo的url参数,很多人第一次都会拼错。它不是一个网络地址,而是目标小程序内部的页面路由路径。我先列几个反面例子:

  • 错误写法一:url: 'pages/order/detail?id=1'——少了开头的斜杠,部分基础库能容忍,部分会解析异常;
  • 错误写法二:url: 'https://example.com/pages/order/detail?id=1'——把 H5 页面地址当成小程序页面地址;
  • 错误写法三:url: '/pages/order/detail?keyword=' + 中文关键词——query 参数没有编码,中文或特殊字符会导致目标页面onLoad里拿到的参数乱码或丢失。

正确的拼法是这样:

const keyword = encodeURIComponent('保温杯') const url = `/pages/order/detail?id=123&keyword=${keyword}`

路径以/开头,中间是目标页面在小程序app.json中注册的页面完整路径,query 部分用encodeURIComponent处理。这个url和小程序内部wx.navigateTo的用法完全一致,可以理解成:你在 H5 里替用户执行了一次小程序内部的路由跳转。

另外要注意,目标页面必须真实存在于小程序的页面目录中,而且已经在app.json的pages数组里注册过。注册了但没编译进当前版本,或者路径少写一层目录,都会跳转失败。

3.2 extraData 怎么传,又怎么在小程序侧接收

extraData是wx.miniProgram.navigateTo提供的一个附加数据通道,适合放一些不适合拼在 url 里的结构化数据,比如对象、数组、嵌套 JSON。它的传递规则是:H5 侧调用时传一个对象,目标小程序在App.onLaunch或App.onShow里通过options.referrerInfo.extraData拿到。

H5 侧:

jumpToMiniProgram({ url: '/pages/order/detail?id=123', extraData: { from: 'h5', orderId: '123', userInfo: { name: '张三', level: 'vip' }, }, })

小程序侧接收:

App({ onLaunch(options) { if (options.referrerInfo && options.referrerInfo.extraData) { console.log('extraData', options.referrerInfo.extraData) // 可以存到全局或 Storage,页面再取 } }, onShow(options) { if (options.referrerInfo && options.referrerInfo.extraData) { console.log('extraData onShow', options.referrerInfo.extraData) } }, })

这里有个容易搞混的点:url 上拼的 query 参数,目标页面onLoad(options)能直接拿到;extraData则要到App级别去取。我刚开始以为extraData会和 query 一起出现在页面onLoad里,结果打印出来发现是空的,排查了一圈才想起来去看官方文档。建议传递优先级排列:简单 ID 类数据放 query,复杂结构化数据放extraData。extraData里也别塞特别大的对象,超出一定体积会被截断或导致跳转变慢,尽量精简。

3.3 navigateTo、redirectTo、reLaunch、switchTab 怎么选

wx.miniProgram对象下不止navigateTo一个跳转 API,它一共提供了四个,对应小程序内部四个原生跳转方法,行为差异很大:

API行为描述目标页能否是 tabBar 页url 能否带参数
navigateTo保留当前页面,压入新页面栈,可返回上一页不能可以
redirectTo关闭当前页面,跳转到新页面,不可返回不能可以
reLaunch关闭所有页面,打开新页面可以可以
switchTab切换到 tabBar 页面只能不能,参数会被忽略

绝大多数业务场景用navigateTo就够了,因为 H5 页面在小程序 web-view 里其实对应一个小程序页面,用户跳过去之后多半还要返回 H5 继续操作。但如果你跳的是首页、订单 tab 这类tabBar页面,navigateTo会直接报错,必须用switchTab或者reLaunch。说一下switchTab的一个细节:它的 url 不能带 query 参数,带了也会被忽略,所以你想"跳到首页并携带参数"这个需求,switchTab一上来就实现不了,要么改reLaunch,要么先把数据存到Storage再切 tab。

4. 真机踩坑:从"没反应"到"页面不存在"的排查全过程

4.1 现象一:按钮点了没反应,控制台也不报错

这是我遇到的第一个坑。在微信开发者工具里用 web-view 调试 H5 页面时,点击跳转按钮一切正常;一上真机,在微信里直接打开 H5 链接,点按钮完全没有反应,控制台也看不到任何报错。

排查思路:先确认当前页面是不是真的在小程序 web-view 容器里。我用第 1 章的环境判断函数一测,发现真机上直接通过链接打开的页面,环境返回的是wechat-webview,而不是mini-program-webview。也就是说,用户并不是从小程序 web-view 里进入 H5,那wx.miniProgram当然不存在,调用自然静默失败。

这类问题多数是因为拿了一个普通链接在微信里直接测。正确做法是:先把 H5 页面作为业务域名配到小程序后台,再在小程序的 web-view 组件页面里填写这个 H5 地址,通过小程序开发版或体验版进入 web-view,才能触发wx.miniProgram注入。普通微信浏览器里再怎么测都是白搭。

4.2 现象二:报错提示页面 not found

环境没问题、wx.miniProgram也拿到了,点击跳转后 fail 回调返回类似:

navigateTo:fail page "/pages/order/detail" is not found

这类报错一般是指向目标小程序里根本没有这个页面,或者路径写错。最常见的原因就是把 H5 的路由路径直接当成小程序页面路径——比如 H5 里是/order/detail,小程序里实际页面路径是/pages/order/detail,差了中间一段目录。

排查链条是这样的:先在小程序工程里打开app.json,从pages数组里复制目标页面的真实路径,再核对 url 里的路径是否完全一致,注意大小写和目录层级。小程序页面路径是区分大小写的,写错一个字母照样报 not found。

4.3 现象三:目标是 tabBar 页,navigateTo 直接失败

还有一个报错长这样:

navigateTo:fail can not navigateTo a tabbar page

看到这个报错其实挺欣慰的,因为它说明你环境对、路径对、SDK 也对了,纯粹是跳转方式选错了。目标页面在小程序app.json的tabBar列表里,这类页面只能用switchTab跳,不能用navigateTo。我把工具函数扩展一下支持跳转类型:

// src/utils/miniProgram.ts type JumpType = 'navigateTo' | 'redirectTo' | 'reLaunch' | 'switchTab' export function jumpToMiniProgram(options: JumpOptions, type: JumpType = 'navigateTo') { // 省略前文逻辑... wx.miniProgram[type]({ url: options.url, extraData: options.extraData || {}, success: resolve, fail: reject, }) }

组件层调用时就清晰了:

// 跳订单详情,普通页面 jumpToMiniProgram({ url: '/pages/order/detail?id=123' }) // 跳首页 tab jumpToMiniProgram({ url: '/pages/home/index' }, 'switchTab')

要注意的是,switchTab的 url 不能带参数,刚才第 3 章说过,带参数会直接被忽略,白写。切 tab 还要传数据的话,先把数据写到本地缓存或者通过其他小程序全局存储,再触发 switchTab。

4.4 现象四:开发者工具正常,真机正式版跳不过去

开发版和体验版里跳转都正常,一到线上版本就失灵,或者只有部分用户出问题。这类问题通常不在wx.miniProgram.navigateTo本身,而是 web-view 的底层配置:

  • H5 页面所在的域名没有配置到小程序后台的「业务域名」里,web-view 组件在正式环境根本不会加载这个页面;
  • 配置了业务域名但没下载校验文件放在 H5 根目录,导致正式环境加载失败;
  • 真机微信版本、小程序基础库版本太老,对wx.miniProgram的注入支持不完整。

排查这类问题,先把 web-view 本身能不能正常打开 H5 页面确认清楚:如果 web-view 页面直接白屏,那跳转肯定无从谈起。业务域名配置要到小程序公众平台后台设置,校验文件要求放在 HTTPS 域名根目录下,能通过浏览器直接访问到才算配好。开发工具里有个「不校验合法域名」的开关,开发阶段可以勾上,但正式版这层保护是绕不过去的,务必提前配置。

还有一个容易被忽略的点:小程序版本发布之后,如果你改的是 H5 页面内容,H5 重新发布即可生效;如果你改的是小程序端的页面路径,那必须跟着发一个小程序新版本,否则线上小程序里根本没有那个页面路径,跳转照样 not found。

5. 想跳"另一个指定小程序"?wx.miniProgram 的边界与三条替代路线

5.1 硬边界:navigateTo 只能跳当前小程序内部页面

标题里的"跳转到指定小程序",这里我得敲一下黑板:wx.miniProgram.navigateTo系列 API 能跳的,只有当前承载 web-view 的那一个小程序的内部页面。它没法从 A 小程序的 web-view 里直接跳到 B 小程序的页面,这是很多产品经理和技术同学都会误解的地方。

我遇到过这样的需求:公司有个小程序 A 里嵌了 H5 活动页,产品希望在这个 H5 里点按钮跳到另一个公司的小程序 B 的领券页面。直觉上觉得"都是小程序,应该能跳",但wx.miniProgram.navigateTo恰恰做不到这件事,因为 web-view 的桥接对象只认识了当前小程序。需求如果不加区分直接排期,开发阶段做出来在开发者工具里可能"看起来能用",真机一上就会露馅。

所以接到类似需求,第一步要先确认清楚:目标页面到底属于当前小程序,还是属于另一个 appId。属于当前小程序,用navigateTo系;属于另一个 appId,走下面这三条路。

5.2 替代路线一:公众号场景用 wx.openMiniProgram

如果你这个 Vue3 项目是放在公众号网页里的,想跳到一个指定 appId 的小程序页面,正确的 API 是wx.openMiniProgram。它跟wx.miniProgram.navigateTo最大的区别就是支持appId参数,明确指定目标小程序。

不过它的前置条件比较重:必须先完成wx.config鉴权,而且需要在公众号后台配置 JS 接口安全域名。伪代码给你参考:

import wx from 'weixin-js-sdk' wx.config({ debug: false, appId: '公众号的appId', timestamp: '后端生成的timestamp', nonceStr: '后端生成的nonceStr', signature: '后端生成的signature', jsApiList: [], // openMiniProgram 不需要列在这里,但鉴权本身必须过 }) wx.ready(() => { wx.openMiniProgram({ appId: '目标小程序appId', path: 'pages/index/index?id=1', // 注意这里不带开头的斜杠 extraData: { foo: 'bar' }, success: () => {}, fail: (err) => {}, }) })

注意这里path的写法和wx.miniProgram.navigateTo不一样,openMiniProgram的 path 不带开头的/,很多从 web-view 场景切过来的同学会在这里踩一跤。

5.3 替代路线二:URL Scheme 和 URL Link

如果你的 H5 既不在公众号网页里,也不在小程序 web-view 里,比如就是一个普通分享链接,用户点开之后想进入某个小程序,那就不能用 JSSDK 了。这时候通用的做法是让后端去微信服务端接口生成一条 URL Scheme 或者 URL Link,H5 拿到之后直接location.href = scheme就能拉起小程序。这个过程涉及到服务端鉴权、接口调用和参数拼接,写起来又是一大坨,我只提示一点:这种跳转的成功率受微信版本和用户系统影响比较大,而且有的场景需要用户手动确认,转化率会打折。

5.4 上线前自查清单

我把这一轮实践下来总结的自查清单放在这,每次发布前对照检查一遍,能避免大部分低级事故:

  • 确认 H5 最终使用的容器是小程序 web-view,环境判断函数返回mini-program-webview;
  • 微信 JS-SDK 能正常window.wx,且wx.miniProgram不是undefined;
  • 目标页面路径已经从app.json复制,路径以/开头,与小程序实际页面目录一致;
  • 目标页面如果是 tabBar 页,已改用switchTab,且没有在 url 后面拼参数;
  • 需要传结构化数据时用了extraData,并已在目标小程序App里做好接收和兜底;
  • 小程序后台「业务域名」已配置,校验文件能通过 HTTPS 访问到;
  • 发布顺序注意:小程序端页面路径变更时,先发小程序新版本,再发 H5 版本;
  • 真机自测路径:先通过小程序进入 web-view 页面,再点击跳转按钮,不要用普通微信浏览器打开 H5 来测。

最后再分享一个我自己的使用习惯。现在我在项目里已经把跳转能力集中收敛到了jumpToMiniProgram一个方法里,全局只允许这一条路去碰wx.miniProgram。排查问题时不用满仓库搜navigateTo,报错看 log 前缀[miniProgram]就能定位,新同事接手也只需要看一个文件的注释就能搞懂跳转约定。真机调试时如果遇到无反应,优先在 web-view 页面里手动执行一下console.log(window.wx && window.wx.miniProgram),这个输出能立刻告诉你是容器问题还是代码问题,比一遍遍改代码重新发布快得多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/9 4:09:15

量化私募运维岗解析:网络/IT/IDC三岗位技能与面试指南

量化私募的核心竞争力就是速度、稳定、容量&#xff0c;而这三样&#xff0c;恰好全压在运维肩上。前阵子看到一家百亿量化私募一口气放出网络运维、高级IT运维、高级IDC运维三个岗位&#xff0c;覆盖上海和深圳两地&#xff0c;薪资在行业里相当有竞争力。很多人以为“运维就是…

作者头像 李华
网站建设 2026/10/9 4:09:14

Agent-Reach 深度拆解:AI Agent CLI 工具从环境搭建到任务执行全链路

1. 从"Agent-Reach"这个名字说起&#xff1a;它到底想解决什么问题第一次看到 Agent-Reach 这个项目名&#xff0c;我的直觉是&#xff1a;这大概率是一个围绕 AI Agent 能力边界做文章的工具。Reach 这个词在工程语境里通常有两层含义&#xff0c;一层是"触达&…

作者头像 李华
网站建设 2026/10/9 4:08:27

改进粒子群算法实现多无人机协同航迹规划的Matlab实践

多无人机协同航迹规划&#xff0c;拆开看是“航迹规划”&#xff0c;合起来难就难在“协同”两个字。单架无人机用A*、RRT或者标准粒子群都能跑出路径&#xff0c;但是一旦要求多架无人机同时出发、同时到达、互不碰撞、还要整体代价最小&#xff0c;问题就变成了一个多目标、强…

作者头像 李华
网站建设 2026/10/9 4:07:57

Vim实战:用编辑器跑通图像分类全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/9 4:07:48

校园跑腿微信小程序从0到上线:登录、订单状态机与真机调试实战

前阵子帮人把一个校园跑腿的微信小程序项目从零过到上线前的一步&#xff0c;连源码带文档再带调试&#xff0c;整套流程走下来&#xff0c;确实踩了不少值得记录的坑。这套基于微信小程序的校园跑腿系统&#xff0c;前端是原生小程序&#xff0c;后端配了一套管理接口&#xf…

作者头像 李华
网站建设 2026/10/9 4:07:21

栈算法核心:单调栈、表达式求值与回溯递归的实战指南

1. 先把栈的本质聊透&#xff1a;不只是“先进后出”栈这个数据结构&#xff0c;几乎所有写代码的人第一天就见过&#xff0c;但真正到算法题里能把它用明白的&#xff0c;其实不多。很多朋友问我“栈怎么刷题”&#xff0c;我的回答永远是&#xff1a;先把三个场景啃透&#x…

作者头像 李华