news 2026/4/18 1:42:39

一文吃透栈(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/4/18 6:39:54

现实奇旅:智能机器人,数字赋能下的生活新伙伴

曾几何时&#xff0c;智能机器人宛如科幻电影里的梦幻存在&#xff0c;它们身怀绝技&#xff0c;在虚拟世界中演绎着未来科技的无限可能。而如今&#xff0c;这些曾经只存在于想象中的“高科技”已悄然走进现实&#xff0c;成为我们生活中触手可及的新伙伴。它们长得像人&#…

作者头像 李华
网站建设 2026/4/18 6:35:30

AI行业应用:金融、医疗、教育、制造业落地案例深度分析

一、金融领域&#xff1a;智能风控系统1.1 应用场景信贷风险评估反欺诈检测投资组合优化客户服务自动化1.2 典型案例&#xff1a;智能信贷审批技术架构&#xff1a;graph TD A[客户申请] --> B(数据采集) B --> C{数据预处理} C --> D[特征工程] D --> E[模型预测]…

作者头像 李华
网站建设 2026/4/18 6:38:27

hsweb-framework Easy-ORM深度解析:企业级数据访问层实战指南

hsweb-framework作为基于Spring Boot 2.x开发的全响应式企业级后台管理系统&#xff0c;其内置的Easy-ORM组件为开发者提供了强大的数据访问能力。作为框架的核心数据访问层解决方案&#xff0c;Easy-ORM不仅简化了传统的ORM操作&#xff0c;更通过丰富的扩展机制支持复杂的业务…

作者头像 李华
网站建设 2026/4/18 11:05:48

一个技术总监的管理“自白”

你好&#xff0c;我是许健。欢迎来到我的“技术管理案例课”&#xff01; 我是一个在 IT 行业摸爬滚打了 16 年的老兵&#xff0c;算起来我走上管理岗位也有 8 年了。现在我是 eBay 基础架构工程部的研发总监。和很多人不同的是&#xff0c;我不是“被迫”走上管理岗位的&…

作者头像 李华
网站建设 2026/4/18 7:02:24

量子计算开发避坑指南,VSCode硬件连接问题一网打尽

第一章&#xff1a;VSCode 量子硬件的连接检测在开发量子计算应用时&#xff0c;确保本地开发环境与量子硬件之间的稳定连接至关重要。VSCode 作为主流的集成开发环境&#xff0c;通过扩展插件支持对量子设备的连接状态进行实时检测与调试。开发者可借助 Quantum Development K…

作者头像 李华