用栈实现表达式求值
小结:“用栈求中缀表达式值”较复杂【已基本搞定】,只要此处搞定,“用栈求前缀/后缀表达式值”,就不是问题;“用栈求前缀表达式值”和“用栈求后缀表达式”部分细节相反,代码描述基本相同。
- “用栈求中缀表达式值”,需要考虑:算子,运算符,括号,问题;
- “用栈求后缀/前缀表达式值”,需要考虑:算子,运算符,不需要考虑括号问题;
- 所以:相比较而言,对于计算机而言,“用栈求后缀/前缀表达式值”,更加高效;
- 用栈求中缀表达式值:
- 原则:
- 创建两个栈,栈1和栈2;从左到右,依次遍历中缀表达式元素;
- 遇见算子,入栈1,遇见左括号,入栈2;遇见运算符,待入栈2;
- 如果栈2空,或者栈2顶部为左括号,运算符直接入栈2;
- 如果栈2不空,并且栈2顶部不是左括号【那就是运算符或者右括号】:
- 遍历到的运算符优先级,大于栈2栈顶运算符优先级,入栈;否则,栈2栈顶运算符,依次出栈,直至遍历到的运算符优先级大于栈2中栈顶的优先级;栈2中每出栈一个运算符,对应栈1中,依次出栈2个算子,自右向左排列,并同时利用刚出栈的运算符,进行计算,计算结果入栈1;
- 遍历到左括号,入栈2;遍历到右括号,则栈2中,至左括号之间的运算符,依次出栈,同时,对应栈1中的算子依次出栈,进行上述运算操作
- 最终,中缀表达式遍历完之后,如果栈2中还有运算符,则依次出栈,对应栈1中的算子也依次出栈,做如上的运算,并将最终结果压入栈1中,结束。
- 代码实现:
-
getPriority函数:传入当前所扫描到的表达式字符,与栈2顶字符优先级相比较,若优先级大,则返回1;否则返回0;
1.辅助函数1-判断操作符优先级 int getPriority(char p) { if(p=='+' || p=='-') //注意:此处是==,而不是=;此处是'',而不是“”; return 0; else return 1; }
-
calSub函数:栈2出栈1个运算符,栈1出栈2个算子,进行计算;若不符合数学计算准则,返回0;否则,返回正常计算结果;
2.辅助函数2-栈2出栈1个运算符,栈1出栈2个算子,进行计算,返回计算结果 int calSub(float pand1,char p,float pand2,float & result) //float & result:算子可能为小数,result需要返回值,所以用引用型; //栈2输出一个算子,栈1输出2个运算符,进行计算,结果输出; { if(p=='+') result=pand1+pand2; if(p=='-') result=pand1-pand2; if(p
- 原则: