栈LIFO
1)栈是一种限制插入和删除只能在一个位置上的表。这个位置就是栈顶(top)。普通的清空栈的操作和测试栈是否为空的操作,都是栈的指令系统的一部分。其中我们能对栈直接进行的操作只有基本操作:push(入栈)、pop(出栈)。push相当于插入,而pop相当于把最后插入的元素删除。
一般的模型是,存在某个元素位于栈顶,而该元素是唯一的可见元素。
2)栈的实现:由于栈是一个表,所以任何实现表的方法都能实现栈。那么,ArrayList和LinkedList都支持栈的操作。由于栈的操作是常数时间操作,所以,除非在非常独特的环境下,否则不会出现任何明显的改进。这种独特的方法,一种是链式结构。一种是数组结构。
栈的链表实现:通过在单链表的顶端插入元素来实现push,通过删除表顶端的元素来实现pop操作。top只是考查表顶端元素并返回它的值。
栈的数组实现:模仿的是ArrayList的add操作。与每个栈相关的操作是theArray和topOfStack,对于空栈它是-1.为将某个元素x推入栈中,我们使topOfStack增1,然后将theArray[topOfStack] = x.为了弹出栈元素,我们置返回值为theArray[topOfStack],然后使topOfStack-1.栈很有可能是在计算机科学数组之后最基本的数据结构。
3)后缀表达式
(原式) 4.99*1.06+5.99+6.99*1.06
(后缀表达式)4.99 1.06*5.99+6.99 1.06*
计算这个问题最容易的方法就是使用一个栈。当遇见一个数值时,就把数值压入栈中;当遇到一个符号时,就作用于从栈中弹出的两个数上,再将作用的结果压入栈中。
计算一个后缀表达式,所花费的时间是O(N),因为对输入中的每个元素的处理都是栈的一个操作,相当于是由一些常数时间组起来的时间。注意:当一个后缀表达式给出来时,没有必要知道计算的优先级。
4)中缀到后缀的转换
这里我们坚持普通的优先级法则
例如:中缀表达式 a+b*c+(d*e+f)*g
后缀表达式 abc*+de*f+g*+3.