原始逆波兰式算法(未考虑负数、函数调用状况)算法
1.构建两个栈Operand(操做数栈)和Operator(操做符栈)和一个LAST_TOKEN标记字段。函数
2.扫描给定的字符串,扫描时注意跳过空格,提取完整的操做数、操做符和函数。spa
3.若是得到一个运算符(用B代替)首先构造响应的运算符,构造时须要比较LAST_TOKEN记录字段,来判断重载的操做符的含义,好比若是LAST_TOKEN是数字,那么“-”就是一 个数学运算符,若是LAST_TOKEN是运算符,那么要看“-”后面是否是数字,若是是数字,则认为“-”是“负号”。构造好Operator后和Operator栈栈顶元素(用A替代)比 较:字符串
1)若是A不存在,则把B压入Operator栈中;数学
2)若是B是一个左括号,则忽略A和B的优先级比较,把B压入Operator栈。di
3)若是B是逗号,一样忽略A和B的比较,把B压入Operator栈。字符
4)若是B是一个右括号,则把Operator栈顺序出栈,而后把弹出的元素顺序压入Operand栈中,出栈是须要判断逗号状况,若是是逗号,则不入栈,记录逗号个数,直到栈顶弹出 的是左括号,括号不入Operand栈中。以后看Operator栈顶元素,若是栈顶元素是函数类型,则把函数Operator出栈而后将逗号个数+1构造数字操做数压入Operand栈中,然 后把函数Operator也压入Operand栈中。数字
5)若是A是左括号,则把B直接压入Operator栈。运算符
6)若是B优先级比A高,则把B直接压入Operator栈。
7)若是B优先级低于或等于A的优先级,则把A出栈而后压入Operand栈,反复进行此步骤直到栈顶优先级高于B的优先级或者栈顶是一个括号。
4.扫描完毕后,把Operator栈的元素依次出栈,而后依次压入Operand栈中。