栈:
方法: push pop peek()
栈的实现 :
数组实现 (固定大小 + 可动态扩展)
链表实现
栈的空间复杂度是多少?
O(1),虽然这里需要大小为n的数组,但是这个数组时必须的,我们所说的空间复杂度,指的是除了基础数据存储外还需要的存储空间。
栈的实际使用
函数调用:
操作系统给每个线程分配了独立内存空间,其被组织成栈的结构;用来存储函数调用和临时变量。每进入一个函数,就压入一个栈帧;函数调用完成,对应的栈帧弹出;
表达式求值:
一个栈存值 一个栈存符号 如果将要存入的运算符的优先级和栈顶运算符优先级一样或更低,则进行运算
括号匹配:
[{()}([])] 等都为合法格式,而{[}()]不合法如何判断?
一直压入,遇到和栈顶相同的符号弹出,最后为空则说明合法
浏览器前进后退功能:
abc可回退到b、a,再前进b、c;
两个栈z1 z2,每次页面修改前进压入z1,后退出栈到z2中,前进z2出栈到z1
leetcode:155 用数组来设计栈: push pop top getMin 四个方法
在常数时间内检索到最小元素的栈。
仅仅使用一个数组 + 保存最小值的变量
数组如下: -2 0 min=-2
压入-3,比min小,需要先压入老的min,再压入-3;结果:数组-2 0 -2 -3,min=-3
push比-3大的数,如1 正常push 数组: -2 0 -2 -3 1 min-3
pop一次 数组:-2 0 -2 -3 min-3
pop一次 顶部与min等 弹出2个 数组:-2 0 min=-2
核心思想:
压入比minValue还小的数,先压入老的minValue
弹出min的时候,弹出两次,第一次是当前min,第二次是前半部分的min