20230307 2.2. 堆栈
引题
计算机如何进行表达式求值?
中缀表达式:运算符号位于两个运算数之间。如 ,a+b*c-d/e
后缀表达式:运算符号位于两个运算数之后。如, abc*+de/-
堆栈的抽象数据类型描述
堆栈(Stack):具有一定操作约束的线性表(只在一端(栈顶,Top)做 插入、删除)
-
插入数据:入栈(Push)
-
删除数据:出栈(Pop)
-
后入先出:Last In First Out(LIFO)
类型名称: 堆栈(Stack)
数据对象集:一个有0个或多个元素的有穷线性表。
操作集:长度为MaxSize的堆栈S ∈ Stack,堆栈元素item ∈ ElementType
-
Stack CreateStack( int MaxSize )
: 生成空堆栈,其最大长度为MaxSize; -
int IsFull( Stack S, int MaxSize )
:判断堆栈S是否已满; -
void Push( Stack S, ElementType item )
:将元素item压入堆栈; -
int IsEmpty ( Stack S )
:判断堆栈S是否为空; -
ElementType Pop( Stack S )
:删除并返回栈顶元素;
栈的顺序存储实现
栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成。
堆栈的链式存储实现
栈的链式存储结构实际上就是一个单链表,叫做链栈。插入和删除操作只能在链栈的栈顶进行。
堆栈应用
- 表达式求值
基本策略:将中缀表达式转换为后缀表达式,然后求值
2+9/3-5 → 2 9 3 / + 5 - - 函数调用及递归实现
- 深度优先搜索
- 回溯算法
Java 关联
-
java.util.Stack
:继承Vector
,线程同步 -
Java 更推荐使用
java.util.Deque
接口实现栈功能 -
ArrayDeque
是Deque
的数组实现 -
LinkedList
同时实现了List
和Deque
接口,是Deque
的链表实现 -
Deque
之所以可以实现栈功能,实际上就是操作队列的头部,push
就是addFirst
,pop
就是removeFirst
ArrayDeque
- 实现上用了大量的位运算
- 和ArrayList一样有设置初始容量的构造方法,但是意思不同,这里是设置能够容纳入参大小的初始容量,实际是不小于入参大小的最接近的2的n次幂,这样做是为了进行位运算
java.util.Stack 方法
只列出部分
- empty
- 判断是否为空
- peek
- 查看此堆栈顶部的对象,不将其从堆栈中移除
- pop
- 移出并返回栈顶对象
- push
- 将一个对象压入这个堆栈的顶部
- search
- 返回最靠近栈顶的equals判断为true的元素