数据正在传送.请稍候

梦游时光互联 » 服务器合租/整机租用 » 用PHP编程计算中序表达式的值 (用class 模拟链表实现堆栈 .:p)
     
本帖主题: 用PHP编程计算中序表达式的值 (用class 模拟链表实现堆栈 .:p)
2006-8-8 11:36 PM No.1 发表人:ttmax  社区短消息  TOP
ttmax (瘟神)
King
Rank: 6Rank: 6
洪魔!天下无双


热血青年奖  
UID 1330
精华 5
积分 1630
帖子 1146
体力 1121
威望 99
贡献 0
阅读权限 70
注册 2006-6-18
状态 离线
[广告]: 优惠券代码:20111001FF20% 有效期:2011.10.01/2011.10.15
完整测试程序:
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
{
    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编程计算中序表达式的值 (用class 模拟链表实现堆栈 .:p)
2006-8-14 02:44 AM No.2 发表人:ttmax  社区短消息  TOP
ttmax (瘟神)
King
Rank: 6Rank: 6
洪魔!天下无双


热血青年奖  
UID 1330
精华 5
积分 1630
帖子 1146
体力 1121
威望 99
贡献 0
阅读权限 70
注册 2006-6-18
状态 离线
[广告]: 新手解疑1:FTP空间各文件目录的作用
申请精华!

回复:用PHP编程计算中序表达式的值 (用class 模拟链表实现堆栈 .:p)
2006-8-18 03:50 PM No.3 发表人:conanwchen  个人Blog  社区短消息  TOP
conanwchen (..臸剰菰単!)
Cnservers
Rank: 7Rank: 7Rank: 7
人老啦~不中用了??


UID 334
精华 0
积分 712
帖子 494
体力 471
威望 8
贡献 0
阅读权限 60
注册 2006-2-21
状态 离线
[广告]: 备案信息核验单 - 现行国内备案必看
全部身精?









我可以很负责任的告诉你:我对我说的话不负任何的责任~~
回复:用PHP编程计算中序表达式的值 (用class 模拟链表实现堆栈 .:p)
2006-8-18 04:43 PM No.4 发表人:ttmax  社区短消息  TOP
ttmax (瘟神)
King
Rank: 6Rank: 6
洪魔!天下无双


热血青年奖  
UID 1330
精华 5
积分 1630
帖子 1146
体力 1121
威望 99
贡献 0
阅读权限 70
注册 2006-6-18
状态 离线
[广告]: 优惠券代码:20111001FF20% 有效期:2011.10.01/2011.10.15
不是全部1!!
个别的我认为精彩的!


     

Powered by Discuz!3.12 Licensed © 2001-2005
Processed in 0.008071 second(s), 7 queries , Gzip enabled
所有时间为 GMT+8, 现在时间是 2024-11-24 01:52 AM
清除 Cookies - 联系我们 - 梦游时光互联 -