news 2026/5/7 14:18:23

一文吃透栈(Stack):从底层原理到经典算法实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一文吃透栈(Stack):从底层原理到经典算法实战

一、什么是栈?

栈(Stack):是一种后进先出(LIFO,Last In First Out)的数据结构。

栈的核心特性

  • 只能在一端操作(称为栈顶 top

  • 基本操作:

    • 入栈(push)

    • 出栈(pop)

    • 查看栈顶(peek)

二、栈的逻辑结构 vs 物理结构

逻辑结构:

栈顶 ┌───┐ │ 3 │ ├───┤ │ 2 │ ├───┤ │ 1 │ └───┘ 栈底

物理实现方式:

  1. 数组实现(顺序栈)

  2. 链表实现(链式栈)


三、手写一个顺序栈(数组实现)

1. 栈的基本结构

public class ArrayStack { private int[] data; // 存放元素 private int top; // 栈顶指针 private int capacity; public ArrayStack(int capacity) { this.capacity = capacity; data = new int[capacity]; top = -1; // 栈空 } }

2. 入栈(push)

public void push(int value) { if (top == capacity - 1) { throw new RuntimeException("栈满,无法入栈"); } data[++top] = value; }

关键点:

  • top == capacity - 1→ 栈满

  • ++top再赋值


3. 出栈(pop)

public int pop() { if (top == -1) { throw new RuntimeException("栈空,无法出栈"); } return data[top--]; }

关键点:

  • 先取值,再top--


4. 查看栈顶(peek)

public int peek() { if (top == -1) { throw new RuntimeException("栈空"); } return data[top]; }

5. 测试代码

public static void main(String[] args) { ArrayStack stack = new ArrayStack(5); stack.push(1); stack.push(2); stack.push(3); System.out.println(stack.pop()); // 3 System.out.println(stack.peek()); // 2 }

四、链式栈(链表实现)

优势:不需要扩容,不受数组大小限制

1. 节点定义

class Node { int value; Node next; Node(int value) { this.value = value; } }

2. 栈结构

public class LinkedStack { private Node top; public LinkedStack() { top = null; } }

3. 入栈(头插法)

public void push(int value) { Node node = new Node(value); node.next = top; top = node; }

4. 出栈

public int pop() { if (top == null) { throw new RuntimeException("栈空"); } int value = top.value; top = top.next; return value; }

五、栈的经典应用 ①:括号匹配

问题描述

输入: "{[()]}" 输出: true

解题思路

  • 左括号 → 入栈

  • 右括号 → 弹栈匹配


代码实现

public static boolean isValid(String s) { Deque<Character> stack = new ArrayDeque<>(); for (char c : s.toCharArray()) { if (c == '(' || c == '[' || c == '{') { stack.push(c); } else { if (stack.isEmpty()) return false; char top = stack.pop(); if (c == ')' && top != '(') return false; if (c == ']' && top != '[') return false; if (c == '}' && top != '{') return false; } } return stack.isEmpty(); }

六、栈的经典应用 ②:表达式求值(逆波兰)

示例

输入:["2","1","+","3","*"] 输出:9

代码实现

public static int evalRPN(String[] tokens) { Deque<Integer> stack = new ArrayDeque<>(); for (String token : tokens) { if ("+-*/".contains(token)) { int b = stack.pop(); int a = stack.pop(); switch (token) { case "+": stack.push(a + b); break; case "-": stack.push(a - b); break; case "*": stack.push(a * b); break; case "/": stack.push(a / b); break; } } else { stack.push(Integer.parseInt(token)); } } return stack.pop(); }

七、栈在系统层面的真实应用

1. JVM 虚拟机栈

  • 每个线程一个栈

  • 栈帧包含:

    • 局部变量表

    • 操作数栈

    • 返回地址

递归本质 = 不断入栈


2. 函数调用过程

void a() { b(); } void b() { c(); }

调用顺序:

a 入栈 b 入栈 c 入栈 c 出栈 b 出栈 a 出栈

八、栈常见面试问题总结

题型关键词
括号匹配
单调栈下一个更大元素
表达式求值操作数栈
DFS / 回溯系统栈
中序 → 后序

九、总结一句话

栈的本质:延迟处理 + 最近优先

掌握栈,你会突然发现:

  • 递归不再神秘

  • 表达式计算有迹可循

  • 很多“看起来复杂”的问题,本质只是一个栈

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

数字技术为文化遗产的展陈带来了前所未有的变革和创新

文化遗产&#xff0c;作为人类文明的瑰宝&#xff0c;承载着过去的记忆&#xff0c;见证着历史的变迁&#xff0c;蕴含着深厚的文化价值与精神内涵。传统的文化遗产展陈方式&#xff0c;虽在一定程度上能让观众领略其魅力&#xff0c;但受限于空间、时间、表现形式等因素&#…

作者头像 李华
网站建设 2026/4/29 17:08:07

跨平台移动端开发终极指南:UniApp框架完整教程

跨平台移动端开发终极指南&#xff1a;UniApp框架完整教程 【免费下载链接】yudao-cloud ruoyi-vue-pro 全新 Cloud 版本&#xff0c;优化重构所有功能。基于 Spring Cloud Alibaba MyBatis Plus Vue & Element 实现的后台管理系统 用户小程序&#xff0c;支持 RBAC 动态…

作者头像 李华
网站建设 2026/5/6 14:30:53

【稀缺资料】资深MLOps专家亲授:Docker缓存层级设计的7个原则

第一章&#xff1a;AI 模型的 Docker 缓存策略概述在构建 AI 模型服务时&#xff0c;Docker 成为标准化部署的核心工具。由于模型训练和推理依赖大量依赖库与数据文件&#xff0c;镜像构建过程往往耗时且资源密集。合理利用 Docker 的层缓存机制&#xff0c;可显著提升构建效率…

作者头像 李华
网站建设 2026/4/25 3:22:11

容器网络瓶颈如何破?,智能Agent互联性能优化全解析

第一章&#xff1a;容器网络瓶颈如何破&#xff1f;&#xff0c;智能Agent互联性能优化全解析在现代云原生架构中&#xff0c;容器化应用的快速部署与弹性伸缩能力极大提升了系统敏捷性&#xff0c;但随之而来的容器间网络通信延迟、带宽竞争和连接不稳定等问题&#xff0c;成为…

作者头像 李华
网站建设 2026/5/1 9:45:01

书籍-钟嵘《诗品》

钟嵘《诗品》详细介绍 书籍基本信息 书名&#xff1a;诗品 作者&#xff1a;钟嵘&#xff08;南朝梁&#xff09; 成书时间&#xff1a;南朝梁武帝时期&#xff08;约公元513-517年&#xff09; 卷数&#xff1a;3卷 类别&#xff1a;诗歌理论、文学批评、诗学专著、古典文论 地…

作者头像 李华