1.栈的表达式求值
算法思想
该算法在读入用户输入的中缀表达式后,直接对其进行计算。算法的基本流程如下:首先建立两个栈OPTR(操作符栈)和OPND(操作数栈),分别用于存放操作符和操作数,然后对用户输入的表达式进行扫描。如果遇到数字,就将其压入数值栈OPND,并读入表达式的下一个字符;如果遇到操作符,则比较操作符栈OPTR栈顶的操作符与当前索引下的操作符的优先级,并根据比较结果做出不同的操作:
(1)若栈顶操作符的优先级低于当前索引下的操作符,则将当前索引下的操作符压入操作符栈OPTR,并读入表达式的下一个字符;
(2)若栈顶操作符与当前索引下的操作符优先级相同,则将栈顶操作符弹出,并读入表达式的下一个字符;
(3)若栈顶操作符的优先级高于当前索引下的操作符,则取出栈顶操作符op,并从数值栈OPND中依次取出操作数b、a,计算表达式<a,op,b>的值,并将结果压入数值栈OPND中。
(4)重复进行上述操作,直到读取到表达式的结束标记并且操作符栈OPTR为空,此时数值栈OPNDOPND中存放的数值即为表达式计算的最终结果。*
补充:
-
从左到右读进中序表达式的每个字符。
-
如果读到的字符为操作数,则直接输出到后缀表达式中。
-
如果遇到“)”,则弹出栈内的运算符,直到弹出到一个“(”,两者相互抵消。
-
“(”的优先级在栈内比任何运算符都小,任何运算符都可以压过它,不过在栈外却是优先级最高者。
-
当运算符准备进入栈内时,必须和栈顶的运算符比较,如果外面的运算符优先级高于栈顶的运算符的优先级,则压栈;如果优先级低于或等于栈顶的运算符的优先级,则弹栈。直到栈顶的运算符的优先级低于外面的运算符优先级或者栈为空时,再把外面的运算符压栈。
-
中缀表达式读完后,如果运算符栈不为空,则将其内的运算符逐一弹出,输出到后缀表达式中。
2.表达式求值
3.n个元素进栈,共有多少种出栈顺序?
c(2n,n)-c(2n,n+1)=c(2n,n)/(n+1)。其中,n为节点的个数。