ホームページ > php教程 > php手册 > PHPプログラミングを使用してinorder式の値を計算する

PHPプログラミングを使用してinorder式の値を計算する

WBOY
リリース: 2016-06-21 09:07:06
オリジナル
1564 人が閲覧しました

编程

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

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

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

/* =================== 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__


    Please input the inorder expression :

   
   
   


__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);

プッシュ($ stack_on、two_result($ op、$ n1、$ n2)); i];
}

$tmp =rim($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__
式 { $expression } の結果は '$ result'


もう一度試したい場合は、順序式を入力してください:


__EOF__;

?>




関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート