免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 12770 | 回复: 5
打印 上一主题 下一主题

[原创] 用PHP编程计算中序表达式的值 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-02-08 00:45 |只看该作者 |倒序浏览
过程: 用class 模拟链表实现堆栈 .:p

完整测试程序:
http://test.hightman.net/stack/stack_05.php

在表单里可输入: (3+5)/2 之类的表达试,支持 ()+-/*
以下为全部代码

  1. <?php
  2. /* =================== Program Description ==================== */
  3. /* Written by MingLian Mar. (hightman)                          */
  4. /* ============================================================ */

  5. error_reporting(E_ALL & ~E_NOTICE);

  6. if (!defined("NULL"))
  7.     define("NULL", 0);

  8. class s_node
  9. {
  10.     var $data = NULL;
  11.     var $next = NULL;
  12. }


  13. function push(&$stack, $value)
  14. {
  15.     $newnode = new s_node;
  16.     $newnode->;data = $value;
  17.     $newnode->;next = $stack;

  18.     $stack = $newnode;
  19. }

  20. function pop(&$stack, &$value)
  21. {
  22.     if ($stack != NULL)
  23.     {
  24.     $value = $stack->;data;
  25.     $stack = $stack->;next;
  26.     }
  27.     else
  28.     $value = -1;
  29. }

  30. function is_operator($op)
  31. {
  32.     return strchr("+-*/()", $op);
  33. }

  34. function privority($op)
  35. {
  36.     if ($op == ')' || $op == '(')
  37.     return 1;
  38.     else if ($op == '+' || $op == '-')
  39.     return 2;
  40.     else if ($op == '*' || $op == '/')
  41.     return 3;
  42.     else
  43.     return 0;
  44. }

  45. function two_result($op, $n1, $n2)
  46. {
  47.     switch ($op)
  48.     {
  49.     case '+' : return ($n2 + $n1);
  50.     case '-' : return ($n2 - $n1);
  51.     case '*' : return ($n2 * $n1);
  52.     case '/' : return ($n2 / $n1);
  53.     }
  54. }

  55. // main program
  56. $expression = trim($_POST['expression']);

  57. if (empty($expression))
  58. {
  59.     print <<<__EOF__
  60.     <form method="post">;
  61.     Please input the inorder expression :

  62.     <input type="text" size="40" name="expression">;
  63.     <input type="submit" value="submit">;
  64.     </form>;
  65. __EOF__;
  66.     exit();
  67. }

  68. $stack_op = NULL;
  69. $stack_on = NULL;

  70. $n1 = $n2 = 0;
  71. $op = '';

  72. $len = strlen($expression);

  73. $tmp = '';

  74. for ($i = 0; $i < $len; $i++)
  75. {
  76.     if (is_operator($expression[$i]))
  77.     {
  78.     $tmp = trim($tmp);
  79.     if (!empty($tmp))
  80.     {
  81.         push($stack_on, $tmp);
  82.         $tmp = '';
  83.     }

  84.     if ($expression[$i] == '(' || empty($stack_op))
  85.         push($stack_op, $expression[$i]);
  86.     else if ($expression[$i] == ')')
  87.     {
  88.         while ($stack_op->;data != '(')
  89.         {
  90.         pop($stack_on, $n1);
  91.         pop($stack_on, $n2);
  92.         pop($stack_op, $op);

  93.         push($stack_on, two_result($op, $n1, $n2));
  94.         }

  95.         pop($stack_op, $op); // pop the '('
  96.     }
  97.     else {
  98.         while (privority($expression[$i]) <= privority($stack_op->;data))
  99.         {
  100.         pop($stack_on, $n1);
  101.         pop($stack_on, $n2);
  102.         pop($stack_op, $op);

  103.         push($stack_on, two_result($op, $n1, $n2));
  104.         }
  105.         push($stack_op, $expression[$i]);
  106.     }
  107.     }
  108.     else
  109.     $tmp .= $expression[$i];
  110. }

  111. $tmp = trim($tmp);
  112. if (!empty($tmp))
  113. {
  114.     push($stack_on, $tmp);
  115.     $tmp = '';
  116. }

  117. while (!empty($stack_op))
  118. {
  119.     pop($stack_op, $op);
  120.     pop($stack_on, $n1);
  121.     pop($stack_on, $n2);

  122.     push($stack_on, two_result($op, $n1, $n2));
  123. }

  124. $result = 0;
  125. pop($stack_on, $result);

  126. print <<<__EOF__
  127.     The expression { $expression } result is '$result'

  128.     <form method="post">;
  129.     If you wan to try again, Please input the inorder expression :

  130.     <input type="text" size="40" name="expression" value="$expression">;
  131.     <input type="submit" value="submit">;
  132.     </form>;
  133. __EOF__;

  134. ?>;
复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2004-02-08 00:50 |只看该作者

[原创] 用PHP编程计算中序表达式的值

建议以后用[code][/code]来显示代码,这样可以保留代码的缩进,方便浏览

论坛徽章:
0
3 [报告]
发表于 2004-02-08 00:52 |只看该作者

[原创] 用PHP编程计算中序表达式的值

sorry, 初次发贴,已经修正.

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2004-02-08 01:02 |只看该作者

[原创] 用PHP编程计算中序表达式的值

>;初次驾到
自称“架到”似乎不符合中国人的习惯吧,呵呵,我是书呆子,有时喜欢咬文嚼字,欢迎大驾光临。

论坛徽章:
0
5 [报告]
发表于 2004-02-08 01:08 |只看该作者

[原创] 用PHP编程计算中序表达式的值

再次sorry.  //blush
longnetpro 该用户已被删除
6 [报告]
发表于 2004-02-08 10:12 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP