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

yizhihongxing

下面我来详细讲解用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使用GD库输出汉字的方法【测试可用】

    下面是详细的攻略: 1. 了解GD库 GD库是一款在PHP中非常流行的图片处理库,它可以让我们在PHP中轻松地实现图片的裁剪、缩放、添加水印等功能。而要输出汉字,我们则需要安装并启用GD库的FreeType支持。在安装GD库时,务必要开启FreeType支持。 2. 使用GD库输出汉字的步骤 2.1 将文字转换成图片 我们首先需要将要输出的汉字转换成图片。这…

    PHP 2023年5月26日
    00
  • PHP字典树(Trie树)定义与实现方法示例

    PHP字典树(Trie树)定义与实现方法示例 定义 Trie树,也叫字典树或者单词查找树,是一种树形数据结构,常用于统计或者排序字符串数据集。它能够高效地支持字符串数据的插入、查找和前缀搜索等操作,时间复杂度与字符串长度有关,对于一定量的字符串集合,它的查找效率比哈希表更高。 Trie树与二叉查找树最大的不同在于,Trie树每个节点不仅仅存储一个关键码,而是…

    PHP 2023年5月27日
    00
  • php curl发起get与post网络请求案例详解

    PHP Curl发起GET与POST网络请求案例详解 什么是Curl Curl是一个命令行工具和库,用于实现客户端和服务器之间的数据传输。Curl支持绝大多数的协议和网络协议,包括HTTP、FTP、POP3、IMAP、SCP、SMTP等。Curl是一个非常强大的工具,也被广泛应用于各个领域的开发工作中。 Curl也是PHP的一个扩展,PHP Curl可以方便…

    PHP 2023年5月27日
    00
  • php的单例模式及应用场景详解

    让我来详细讲解一下“PHP的单例模式及应用场景详解”这个话题。 什么是单例模式? 单例模式是一种创建型设计模式,它确保一个类只有一个实例,并且提供一个全局访问点来访问该实例。单例模式是应用程序开发中常用的设计模式之一,它将一个类的对象与全局范围的访问点联系起来,这样可以确保只有一个类的实例可以被访问。 如何实现单例模式? 实现单例模式的关键在于确保只有一个对…

    PHP 2023年5月27日
    00
  • 关于Laravel Route重定向的一个注意点

    接下来我会为大家详细讲解关于 Laravel Route 重定向的一个注意点。 问题描述 在 Laravel 开发过程中,我们经常需要定义路由。有时,我们需要将某个路由重定向到另一个路由上。这时,我们可以使用 Laravel 路由的 redirect 方法。例如: Route::redirect(‘/page1’, ‘/page2’); 这个例子表示,当用户…

    PHP 2023年5月23日
    00
  • 用PHP写的MySQL数据库用户认证系统代码

    下面我将为您详细讲解“用PHP写的MySQL数据库用户认证系统代码”的完整攻略。 步骤一:创建MySQL数据库和表格 首先,需要在MySQL中创建一个用于存储用户数据的数据库和表格。可以使用如下SQL代码: CREATE DATABASE `user_authentication`; USE `user_authentication`; CREATE TAB…

    PHP 2023年5月24日
    00
  • php发送get、post请求的6种方法简明总结

    PHP发送GET、POST请求的6种方法简明总结 在PHP中发送HTTP请求是比较常见的需求,本文将总结6种常用的方式,包括使用cURL和不使用cURL的方法。 1. 使用file_get_contents函数发送GET请求 file_get_contents函数可以读取文件内容,也可以用于发送GET请求。下面是一个例子: $url = ‘https://w…

    PHP 2023年5月27日
    00
  • 浅谈PHP设计模式的注册树模式

    简介: 注册树模式,属于结构型的设计模式。一种很简单的设计模式 适用场景: 类似IOC。写一个庞大的类库的时候,为了方便各种资源的归纳,可以统一放到一棵树上。 优点: 把一个个游兵散将一样的对象进行统一管理。 另外可以根据项目的业务场景自定义层级。 缺点: 增加项目的复杂性。 纯粹的注册树写法,缺少单例模式的有点,可能存在重复创建对象的可能,需要做额外的验证…

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