V

算法可视化

ZHEN
分享到微博分享到 XGitHub 仓库个人主页
学习工具算法复杂度速查算法学习路径
数据结构数组链表栈队列树堆哈希表图字典树并查集LRU 缓存跳表线段树B+ 树布隆过滤器树状数组
经典排序算法冒泡排序鸡尾酒排序双调排序选择排序插入排序二分插入排序希尔排序归并排序自顶向下归并快速排序三路快排双轴快排堆排序计数排序基数排序桶排序
图算法Dijkstra 最短路Kruskal 最小生成树Prim 最小生成树Bellman-Ford 最短路拓扑排序Floyd 多源最短路强连通分量2-SAT最大流二分图匹配LCA 倍增欧拉路径
动态规划编辑距离0-1 背包完全背包最长公共子序列最长递增子序列硬币找零方案数石子合并旅行商 TSP树形 DP数位 DP换根 DP
回溯与搜索N 皇后子集生成全排列组合总和迷宫寻路岛屿数量单词搜索数独A* 寻路
字符串KMP 字符串匹配Rabin-KarpBoyer-MooreManacher后缀数组LCP / height 数组AC 自动机Z 函数
数学与数论埃氏筛线性筛欧几里得算法快速幂扩展欧几里得中国剩余定理欧拉函数米勒-拉宾FFTPollard's Rho
计算几何凸包旋转卡壳最近点对线段相交扫描线求交
查找二分查找二分边界旋转数组搜索二分答案三分查找

栈 Stack

数据结构 · 后进先出的线性表

什么是栈

栈是一种只能在一端操作的线性表。这一端叫栈顶,另一端是栈底。所有的添加和删除都只发生在栈顶——你没法从中间或底部插手。

往栈顶放一个元素叫 push(压入),从栈顶拿走一个叫 pop(弹出),只看一眼栈顶而不拿走叫 peek。因为进出都在同一端,最后压进去的元素一定最先被弹出——这就是后进先出(LIFO,Last In First Out)。

亲手试试
栈为空

点 push 压入一个元素试试

试试连压 1、2、3,再连弹两次——最先出来的是 3,最后压进去的最先出来。无论栈里有多少元素,push 和 pop 都只动栈顶那一个,所以它们的时间复杂度都是 O(1)。

栈在哪里用

栈最经典的身影是函数调用栈:每调用一个函数就 push 一个栈帧,函数返回就 pop 掉——所以最后被调用的函数最先返回。此外还有:

撤销操作:每步操作压栈,Ctrl+Z 就是弹栈回到上一步。
括号匹配:遇到左括号压栈,遇到右括号弹栈配对,栈空则匹配成功。
浏览器后退:每访问一个页面压栈,后退就是弹栈。

往下还会接着讲队列——和栈相反,它是先进先出(FIFO),从一端进、另一端出。