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

下面我来详细讲解用PHP实现的四则运算表达式计算实现代码的攻略,包括以下几个步骤:

  1. 获取用户输入的四则运算表达式,并进行合法性检验;

  2. 将表达式转换为逆波兰表达式(RPN)形式;

  3. 计算逆波兰表达式,得出最终的计算结果。

接下来我来详细解释每个步骤的具体实现。

1. 获取用户输入的四则运算表达式,并进行合法性检验

首先,我们需要获取用户输入的四则运算表达式,可以使用PHP的内置函数readline()来实现。获取到表达式后,我们需要对其进行合法性检验,以防止用户输入的表达式不符合预期,导致程序崩溃或出错。具体的检验方法可以包括以下几个步骤:

  • 检测表达式中是否只包含数字、括号、加减乘除等符号;
  • 检测表达式中括号是否匹配、是否嵌套等;
  • 检测表达式中运算符使用是否正确,如相邻运算符是否合法等。

2. 将表达式转换为逆波兰表达式(RPN)形式

接下来,我们需要将表达式转换为逆波兰表达式(RPN)形式。RPN是一种去除了括号和运算符优先级的数学表达式,它由操作数和后缀表达式中的操作符组成。RPN的优点是计算顺序固定,方便计算机计算。具体的转换方法可以使用栈来实现,可以包括以下几个步骤:

  • 从左往右遍历表达式中的每个元素,遇到数字就直接输出,遇到运算符就将其压入栈中;
  • 如果遇到左括号,则将其压入栈中;
  • 如果遇到右括号,则将栈中所有元素依次弹出并输出,直到遇到左括号;
  • 如果遇到运算符,则比较其与栈顶元素的优先级,如果栈顶元素优先级低,则将栈顶元素弹出并输出,直到该运算符优先级不低于栈顶元素优先级,然后将该运算符压入栈中。

3. 计算逆波兰表达式,得出最终的计算结果

最后,我们需要对转换后的逆波兰表达式进行计算,得出最终的计算结果。计算方法也可以使用栈来实现,可以包括以下几个步骤:

  • 从左往右遍历逆波兰表达式中的每个元素,遇到数字就将其压入栈中;
  • 如果遇到运算符,则取出栈顶的两个元素,按照该运算符进行运算,将结果压入栈中;
  • 遍历完整个逆波兰表达式后,栈中剩余的元素就是最终的计算结果。

下面是一个用PHP实现四则运算表达式计算的示例代码:

<?php

// 获取用户输入的四则运算表达式
$expr = readline("请输入四则运算表达式:");

// 进行合法性检验(略)

// 将表达式转换为逆波兰表达式(RPN)形式
function toRpn($expr) {
    $stack = [];  // 运算符栈
    $rpn = [];    // 逆波兰表达式

    // 运算符优先级
    $priority = [
        '+' => 1,
        '-' => 1,
        '*' => 2,
        '/' => 2,
        '(' => 0,
        ')' => 0,
    ];

    // 遍历表达式中的每个元素
    foreach (str_split($expr) as $c) {
        if (is_numeric($c)) {
            // 如果是数字,直接加入逆波兰表达式
            $rpn[] = $c;
        } else {
            if ($c == '(') {
                // 如果是左括号,直接加入运算符栈
                array_push($stack, $c);
            } elseif ($c == ')') {
                // 如果是右括号,弹出运算符栈中的元素,加入逆波兰表达式,直到遇到左括号
                while (($s = array_pop($stack)) != '(') {
                    $rpn[] = $s;
                }
            } else {
                // 如果是运算符,比较其与栈顶元素的优先级,如果栈顶元素优先级低,则弹出栈顶元素加入逆波兰表达式
                while (!empty($stack) && $priority[end($stack)] >= $priority[$c]) {
                    $rpn[] = array_pop($stack);
                }
                array_push($stack, $c);
            }
        }
    }

    // 将栈中剩余的运算符加入逆波兰表达式中
    while (!empty($stack)) {
        $rpn[] = array_pop($stack);
    }

    return $rpn;
}

// 计算逆波兰表达式,得出最终的计算结果
function calcRpn($rpn) {
    $stack = [];  // 数字栈

    // 遍历逆波兰表达式中的每个元素
    foreach ($rpn as $c) {
        if (is_numeric($c)) {
            // 如果是数字,直接加入数字栈
            array_push($stack, $c);
        } else {
            // 如果是运算符,取出数字栈顶的两个元素,按照该运算符进行运算,将结果压入数字栈
            $b = array_pop($stack);
            $a = array_pop($stack);
            switch ($c) {
                case '+': array_push($stack, $a + $b); break;
                case '-': array_push($stack, $a - $b); break;
                case '*': array_push($stack, $a * $b); break;
                case '/': array_push($stack, $a / $b); break;
            }
        }
    }

    // 数字栈中剩余的元素就是最终的计算结果
    return array_pop($stack);
}

// 转换为逆波兰表达式
$rpn = toRpn($expr);

// 计算逆波兰表达式,得出最终的计算结果
$result = calcRpn($rpn);

echo "计算结果为:$result\n";

假设用户输入的表达式为3*(4+5)-6/2,运行以上代码可以得到输出结果为:计算结果为:31

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用PHP实现的四则运算表达式计算实现代码 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 完美解决PHP中文乱码

    要想完美解决 PHP 中文乱码问题,需要按照以下步骤进行设置: 设置 php.ini 打开 php.ini 文件,找到以下两行所在位置(可能会有多处): ;default_charset = ;mbstring.language = Japanese 将其修改为: default_charset = "utf-8" mbstring.la…

    PHP 2023年5月23日
    00
  • 微信小程序结合ThinkPHP5授权登陆后获取手机号

    下面给出详细的攻略,分为以下几个步骤: 获取微信小程序用户的授权信息。 发送授权凭证code到后端服务器,获取session_key和openid。 利用session_key和encryptedData解密用户敏感数据(如手机号等)。 步骤一:获取微信小程序用户的授权信息 在小程序端,可以通过wx.login函数获取用户授权凭证code,示例代码如下: w…

    PHP 2023年5月23日
    00
  • PHP常用技巧总结(附函数代码)

    PHP常用技巧总结 一、字符串处理 1. 字符串反转 可以使用strrev()函数来反转字符串: $string = "Hello World!"; $reversed = strrev($string); echo $reversed; // 输出 "!dlroW olleH" 2. 字符串截取 我们常常需要从一个字…

    PHP 2023年5月24日
    00
  • PHP写的求多项式导数的函数代码

    如果需要编写一个 PHP 函数,用于计算多项式函数的导数,可以按照以下步骤操作: 定义函数名和参数 在开始编写函数代码之前,需要定义函数的名称和参数。在这个例子中,我们可以使用 $a 和 $b 两个参数,其中 $a 是一个整数数组,存储了多项式的系数,$b 是一个整数,表示需要进行多少阶导数计算。因此,函数的定义可以如下: function derivati…

    PHP 2023年5月27日
    00
  • PHP基于文件锁解决多进程同时读写一个文件问题示例

    PHP基于文件锁解决多进程同时读写一个文件问题的方法,可以通过在文件操作之前加锁,从而确保只有一个进程在执行文件操作,其他进程等待。具体步骤如下: 打开文件并加锁 使用PHP的fopen()函数打开需要进行读写操作的文件,通过使用flock()函数设置共享或排它锁,实现对文件的访问控制。 示例: $fp = fopen(‘test.txt’, ‘w+’); …

    PHP 2023年5月27日
    00
  • php使用simple_html_dom解析HTML示例

    下面就给您讲解一下“php使用simple_html_dom解析HTML示例”的完整攻略。 一、简介 simple_html_dom是一个功能强大的PHP第三方库,主要用于HTML文本的解析、遍历以及查找。使用simple_html_dom库,我们可以方便地获取HTML文本中的各种元素和属性,进而对其进行分析处理。 二、安装 simple_html_dom库…

    PHP 2023年5月26日
    00
  • PHP入门学习之字符串操作

    PHP入门学习之字符串操作 本文将向您介绍在PHP中如何对字符串进行操作,包括字符串的拼接、替换、截取、转换等常用操作。 字符串的拼接 在PHP中,可以使用 . 运算符将两个字符串连接起来。例如: $string1 = "Hello"; $string2 = "world!"; $string3 = $string1 …

    PHP 2023年5月23日
    00
  • PHP数组操作汇总 php数组的使用技巧

    PHP数组操作汇总 php数组的使用技巧 1. PHP数组简介 PHP数组是一种非常强大的数据结构,它允许我们在一个变量中存储多个值,这些值可以是不同的数据类型,如字符串、整数、布尔值等。PHP数组有三种类型:数字索引数组、关联数组和多维数组。 2. 数字索引数组的使用技巧 数字索引数组是最常用的数组类型,它使用整数键来索引数组中的值。以下是数字索引数组的基…

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部