后缀表达式的定义
以人类的思维,中缀表达式是正常的表达式形式,因为我们已经熟悉了各种运算符号的优先级,知道在一个表达式中第一个求哪一部分的值,最常见的就是先求括号内部,然后再求括号外部,但是这种求值顺序在计算机看来是很麻烦的,最好的办法是我们输入给计算机的表达式不需要知道操作符优先级,计算机只管按照我们输入的表达式从左到右求值即可,这就要用后缀表达式来实现。后缀表达式是针对中缀表达式而言的,大致可以理解为操作符在两个操作数之后,并不是像中缀表达式那样两个操作数之间必须有一个操作符,后缀表达式最大的特点就是没有必要知道任何运算符的优先规则,如下就是一个后缀表达式:
“23.2 1.43 * 4.43 + 5.32 1.90 * +”
其中缀表达式为:“23.21.43+4.43+5.321.90”
后缀表达式的求值规则为:从左到右扫描后缀表达式,如果遇到一个操作数,将其压入栈中,如果遇到一个操作符,则从栈中弹出两个操作数,注意:在弹出时被减(加、乘、除)数先被弹出,计算结果,然后把结果入栈,直到遍历完后缀表达式,则计算完成,此时的栈顶元素即为计算结果。如上的后缀表达式求值过程为:
1.初始,栈空
2.遇到操作数23.2,入栈
3.遇到操作数1.43,入栈
4.遇到操作符*,弹出栈中两个元素,计算结果入栈
5.遇到操作数4.43,入栈
6.遇到操作符+,弹出占中两个元素,计算结果入栈
7.遇到操作数5.32,入栈
8.遇到操作数1.90,入栈
9.遇到操作符*,弹出栈中两个元素,计算结果入栈
10.遇到操作符+,弹出占中两个元素,计算结果入栈
算法实现(go语言版)
链表实现栈数据结构
package data
type Node struct {
value float64
next *Node
}
//栈,先进后出,后进先出
type MyStack struct {
head *Node
size int
}
//判断栈是否为空
func (st *MyStack) Empty() bool {
if st.size > 0 {
return false
}
return true
}
//获取栈的元素个数
func (st