• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

用PHP编程计算中序表达式的值_php

php 搞代码 7年前 (2018-06-19) 179次浏览 已收录 0个评论

过程: 用class 模拟链表实现堆栈 .:p

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

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

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

error_reporting(E_ALL & ~E_NOTICE);

if (!defined(“NULL”))
    define(“NULL”, 0);

class s_node

http://www.gaodaima.com/46609.html用PHP编程计算中序表达式的值_php

{
    var $data = NULL;
    var $next = NULL;
}

function push(&$stack, $value)
{
    $newnode = new s_node;
    $newnode->data = $value;
    $newnode->next = $stack;

    $stack = $newnode;
}

function pop(&$stack, &$value)
{
    if ($stack != NULL)
    {
    $value = $stack->data;
    $stack = $stack->next;
    }
    else
    $value = -1;
}

function is_operator($op)
{
    return strchr(“+-*/()”, $op);
}

function privority($op)
{
    if ($op == ‘)’ || $op == ‘(‘)
    return 1;
    else if ($op == ‘+’ || $op == ‘-‘)
    return 2;
    else if ($op == ‘*’ || $op == ‘/’)
    return 3;
    else
    return 0;
}

function two_result($op, $n1, $n2)
{
    switch ($op)
    {
    case ‘+’ : return ($n2 + $n1);
    case ‘-‘ : return ($n2 – $n1);
    case ‘*’ : return ($n2 * $n1);
    case ‘/’ : return ($n2 / $n1);
    }
}

// main program
$expression = trim($_POST[‘expression’]);

if (empty($expression))
{
    print <<<__EOF__
    <form method=”post”>
    Please input the inorder expression :

    <input type=”text” size=”40″ name=”expression”>
    <input type=”submit” value=”submit”>
    </form>
__EOF__;
    exit();
}

$stack_op = NULL;
$stack_on = NULL;

$n1 = $n2 = 0;
$op = ”;

$len = strlen($expression);

$tmp = ”;

for ($i = 0; $i < $len; $i++)
{
    if (is_operator($expression[$i]))
    {
    $tmp = trim($tmp);
    if (!empty($tmp))
    {
        push($stack_on, $tmp);
        $tmp = ”;
    }

    if ($expression[$i] == ‘(‘ || empty($stack_op))
        push($stack_op, $expression[$i]);
    else if ($expression[$i] == ‘)’)
    {
        while ($stack_op->data != ‘(‘)
        {
        pop($stack_on, $n1);
        pop($stack_on, $n2);
        pop($stack_op, $op);

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

        pop($stack_op, $op); // pop the ‘(‘
    }
    else {
        while (privority($expression[$i]) <= privority($stack_op->data))
        {
        pop($stack_on, $n1);
        pop($stack_on, $n2);
        pop($stack_op, $op);

        push($stack_on, two_result($op, $n1, $n2));
        }
        push($stack_op, $expression[$i]);
    }
    }
    else
    $tmp .= $expression[$i];
}

$tmp = trim($tmp);
if (!empty($tmp))
{
    push($stack_on, $tmp);
    $tmp = ”;
}

while (!empty($stack_op))
{
    pop($stack_op, $op);
    pop($stack_on, $n1);
    pop($stack_on, $n2);

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

$result = 0;
pop($stack_on, $result);

print <<<__EOF__
    The expression { $expression } result is ‘$result’

    <form method=”post”>
    If you wan to try again, Please input the inorder expression :

    <input type=”text” size=”40″ name=”expression” value=”$expression”>
    <input type=”submit” value=”submit”>
    </form>
__EOF__;

?>

欢迎大家阅读《用PHP编程计算中序表达式的值_php》,跪求各位点评,若觉得好的话请收藏本文,by 搞代码


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:用PHP编程计算中序表达式的值_php

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址