一、什么是堆和栈?
举个例子,算术表达式是由两类对象构成的:运算数和运算符号,不同运算符号优先级不一样
- 中缀表达式:运算符号位于两个运算数之间。如a+b*c-d/e
- 后缀表达式:运算符号位于两个运算数之后。如abc*+de/-
- 前缀表达式:运算符号位于两个运算数之前。如-+a*bc/de
后缀表达式求值策略:从左向右扫描,逐个处理运算数和运算符号,当碰到运算数的时候,把它记住。当碰到运算符号的时候,就把最近记住的两个运算数来进行对应的计算
**启示:**需要有种存储方法,能顺序存储运算数,并在需要时能“倒序”输出
对于后缀表达式 62/3-42+*
重复上面的步骤,直到
运算后得到8,放回去,那么运算结束,最顶上的那个数就是我们最后的结果
时间复杂度是线性的,T(N)=O(N)
二、堆栈的抽象数据类型描述
堆栈(Stack):具有一定操作约束的线性表,只能在一端(栈顶,Top)做插入和删除
- 插入数据:入栈(push)
- 删除数据:出栈(pop)
- 后入先出:Last In First Out(LIFO)
类型名称:堆栈(Stack)
数据对象集:一个有0个或多个元素的有穷线性表
操作集:长度为MAXSIZE的堆栈S∈Stack,堆栈元素item∈ElementType
- 栈的顺序存储实现
栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成
-
1)入栈
-
2)出栈
例子:用一个数组实现两个堆栈,要求最大地利用数组空间,使数组只要有空间入栈操作就可以成功
注意并不是top1+top2=n就表示栈满,因为top代表的是数组的下标,应当是两个栈的栈顶指针相遇时,表示两个栈都满了
- 对应的Push操作
- 对应的Pop操作