Discuz教程网

用PHP实现的四则运算表达式计算实现代码

[复制链接]
authicon dly 发表于 2011-9-3 19:06:37 | 显示全部楼层 |阅读模式
PHP实现:
代码如下:

  1. <?php
  2. /**
  3. * 计算四则运算表达式
  4. */
  5. error_reporting(E_ALL);
  6. $exp = '(1+2*(3+5)/4)*(3+(5-4)*2)';
  7. $arr_exp = array();
  8. for($i=0;$i<strlen($exp);$i++){
  9. $arr_exp[] = $exp[$i];
  10. }
  11. $result = calcexp( array_reverse($arr_exp) );
  12. echo $exp . '=' . $result;
  13. function calcexp( $exp ){
  14. $arr_n = array();
  15. $arr_op = array();
  16. while( ($s = array_pop( $exp )) != '' ){
  17. if( $s == '(' ){
  18. $temp = array(); $quote = 1; $endquote = 0;
  19. while( ($t = array_pop($exp)) != '' ){
  20. if( $t == '(' ){
  21. $quote++;
  22. }
  23. if( $t == ')' ){
  24. $endquote++;
  25. if( $quote == $endquote ){
  26. break;
  27. }
  28. }
  29. array_push($temp, $t);
  30. }
  31. $temp = array_reverse($temp);
  32. array_push($arr_n, calcexp($temp) );
  33. }else if( $s == '*' || $s == '/' ){
  34. $n2 = array_pop($exp);
  35. if( $n2 == '(' ){
  36. $temp = array(); $quote = 1; $endquote = 0;
  37. while( ($t = array_pop($exp)) != '' ){
  38. if( $t == '(' ){
  39. $quote++;
  40. }
  41. if( $t == ')' ){
  42. $endquote++;
  43. if( $quote == $endquote )
  44. break;
  45. }
  46. array_push($temp, $t);
  47. }
  48. $temp = array_reverse($temp);
  49. $n2 = calcexp($temp);
  50. }
  51. $op = $s;
  52. $n1 = array_pop($arr_n);
  53. $result = operation($n1, $op, $n2);
  54. array_push($arr_n, $result);
  55. }elseif( $s == '+' || $s == '-' ){
  56. array_push($arr_op, $s);
  57. }else{
  58. array_push($arr_n, $s);
  59. }
  60. }
  61. $n2 = array_pop($arr_n);
  62. while( ($op = array_pop($arr_op)) != '' ){
  63. $n1 = array_pop($arr_n);
  64. $n2 = operation($n1, $op, $n2);
  65. }
  66. return $n2;
  67. }
  68. function operation( $n1, $op, $n2 ){
  69. switch ($op) {
  70. case '+':
  71. return intval($n1) + intval($n2);
  72. break;
  73. case '-':
  74. return intval($n1) - intval($n2);
  75. break;
  76. case '*':
  77. return intval($n1) * intval($n2);
  78. break;
  79. case '/':
  80. return intval($n1) / intval($n2);
  81. break;
  82. }
  83. }
复制代码

这个实现方式中使用了两个堆栈,一个用来存储数字,一个用来存储运算符,遇到括号以后就递归进入括号内运算,实现方式有点笨拙,后面补充一下“逆波兰表达式”的算法实现。




上一篇:PHP中获取远程客户端的真实ip地址的方法
下一篇:PHP5 的对象赋值机制介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-6-17 11:33

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表