HTML代码:

  1. <!doctype html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport"
    content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    </head>
    <body>
    <h1>高级计算器</h1>
    请输入运算表达式:
    <br/><input type="text" name="exp" value=""><button class="">计算</button>
    <br/>计算结果是:<b></b>
    </body>
    </html>

    <script src="./jquery.min.js"></script>
    <script>
    $(function(){
    $('button').click(function(){
    var exp = $('input').val();
    $.ajax({
    url: 'exp.php',
    data:{
    'exp':exp
    },
    type:'post',
    dataType:'json',
    success:function(res){
    $('b').text(res.data)
    }
    })
    })

    })
    </script>

php代码:

  1. <?php
    $exp = isset($_POST['exp']) ? $_POST['exp'] : '';

    if (empty($exp)) return;

    /**
    *3+2*6-7
    * 60+5*10-70
    * 5*5*3-5+1/2*4-6
    */

    //数字栈
    $num_arr = [];

    //运算符号栈
    $oper_arr = [];

    //$exp = '3+6*2-7';

    $len = strlen($exp);

    $temp_str = '';
    for ($i = 0; $i < $len; $i++) {
    if (isOper($exp[$i])) {
    /**
    * 1.如果运算符栈为空,就直接入栈
    * 2.如果不为空,判断优先级:
    * 2.1 如果当前运算符小于等于栈顶运算符优先级,就直接用栈顶运算符计算,并且把计算结果入数字栈,然后把当前符号入符号栈
    * 2.2 如果当前运算符大于符号栈顶运算符,就直接入栈
    */

    //判断符号栈是否空
    if (count($oper_arr) == 0) { //空
    //入符号栈
    array_push($oper_arr, $exp[$i]);
    } else {

    //当前符号级别
    $exp_level = get_level($exp[$i]);

    //栈顶符号级别
    while (count($oper_arr) != 0 && $exp_level <= get_level($oper_arr[count($oper_arr) - 1])) {

    //直接用栈顶符号计算
    $res = calc($num_arr, $oper_arr);
    //再把计算出的结果入数字栈
    array_push($num_arr, $res);
    }

    //跳出循环后,入符号栈
    array_push($oper_arr, $exp[$i]);

    }

    } else {
    $temp_str .= $exp[$i];
    //如果是字符串最后一个,就直接入栈
    if ($i + 1 == $len) {
    array_push($num_arr, $temp_str);
    } else {
    //数字,数字栈
    if(isOper($exp[$i+1])){
    array_push($num_arr, $temp_str);
    $temp_str = '';
    }
    }

    }
    }
    //最后一步运算数字栈和符号栈剩余的
    $res = calc($num_arr, $oper_arr);

    echo json_encode(['data' => $res]);
    die;

    //判断字符串是否为运算符
    function isOper($val)
    {
    if ($val == '+' || $val == '-' || $val == '*' || $val == '/') {
    return true;
    }
    return false;

    }

    /*
    *判断运算符的级别
    */
    function get_level($val)
    {
    if ($val == '*' || $val == '/') {
    return 2;
    } else if ($val == '+' || $val == '-') {
    return 1;
    }
    }

    /**
    * 数字运算
    * @param $num_arr 数字栈
    * @param $oper_arr 符号栈
    * @return float|int|mixed
    */
    function calc(&$num_arr, &$oper_arr)
    {
    $val2 = array_pop($num_arr);
    $val1 = array_pop($num_arr);
    $oper = array_pop($oper_arr);

    switch ($oper) {
    case '+':
    return $val1 + $val2;
    break;
    case '-':
    return $val1 - $val2;
    break;
    case '*':
    return $val1 * $val2;
    break;
    case '/':
    return $val1 / $val2;
    break;
    }
    }

 

php-高级计算器的更多相关文章

  1. 软件工程(QLGY2015)第二次作业点评(随机挑选20组点评)

    相关博文目录: 第一次作业点评 第二次作业点评 第三次作业点评 说明:随机挑选20组点评,大家可以看看blog名字,github项目名字,看看那种是更好的,可以学习,每个小组都会反应出一些问题,希望能 ...

  2. Linux shell 变量 数学 运算

    Abstract : 1)  Linux shell 中使用 let , [ ] ,(( )) 三种运算符操作 shell 变量进行简单的基本运算: 2)Linux shell 中使用 expr 与 ...

  3. 如何计算一个字符串表示的计算式的值?——C_递归算法实现

    在<C程序设计伴侣>的8.7.3 向main()函数传递数据这一小节中,我们介绍了如何通过main()函数的参数,向程序传递两个数据并计算其和值的简单加法计算器add.exe.这个程序,好 ...

  4. 三星galaxy s4问题解决及快捷操作

    http://blog.csdn.net/pipisorry/article/details/38474827 三星galaxy s4更改锁屏方式时出现故障 屏幕锁定设置除password以外,其它锁 ...

  5. Lua 解释器

    Lua 解释器 警告⚠️:这将是一个又臭又长的系列教程,教程结束的时候,你将拥有一个除了性能差劲.扩展性差.标准库不完善之外,其他方面都和官方相差无几的 Lua 语言解释器.说白了,这个系列的教程实现 ...

  6. 三星galaxy S4快捷功能

    你不知道的s4那些快捷操作全面挖掘 1.截屏:S4有三种截屏方法: 一种是常见的同一时候按住home键和电源键大概2秒左右时间. 另外一种是打开手势感应,设定→我的设备→动作与手势→手掌动作→截取屏幕 ...

  7. int与byte的区别

    Java中涉及byte.short和char类型的运算操作首先会把这些值转换为int类型,然后对int类型值进行运算,最后得到int类型的结果.因此,如果把两个byte类型值相加,最后会得到一个int ...

  8. php实现单,双向链表,环形链表解决约瑟夫问题

    传智播客PHP学院 韩顺平 PHP程序员玩转算法第一季  http://php.itcast.cn 聊天篇: 数学对我们编程来说,重不重要? 看你站在什么样的层次来说. 如果你应用程序开发,对数学要求 ...

  9. 第4天:scipy库

    一.SciPy库概述 1.numpy提供向量和矩阵的相关操作,高级计算器 2.SciPy在统计.优化.插值.数值积分.视频转换等,涵盖基础科学计算相关问题. (额,对统计和概率,数理完全一窍不通) 3 ...

随机推荐

  1. Java 语言的主要特性

    Java语言是简单的 Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用. Java丢弃了C++中很少使用的.很难理解的.令人迷惑的那些特性,如操作符重载.多继承.自动的强 ...

  2. 8.5-7 mkfs、dumpe2fs、resize2fs

    8.5 mkfs:创建Linux文件系统     mkfs命令用于在指定的设备(或硬盘分区等)上创建格式化并创建文件系统,fdisk和parted等分区工具相当于建房的人,把房子(硬盘),分成几居室( ...

  3. Keil编译后的Code,RO,RW,ZI分别表示什么以及和芯片Flash、SRAM的对应关系

    在使用keil开发STM32应用程序时,点击Build后在Build Output窗口中经常会有如下信息:<ignore_js_op> 以前一直好奇这几个参数和实际使用的STM32芯片中F ...

  4. Linux下安装JDK 1.8你必须知道的糟心事

    来源:Atstudy网校 1.简介 在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还的一个一个的摸索尝试,而且网上大多数都是一些Or ...

  5. java面试一日一题:java中的垃圾回收器

    问题:请讲下java中垃圾回收器有哪些? 分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器 回答要点: 主要从以下几点去考虑, 1.垃圾回收器的种类 2.每种垃圾回收器的着重点是什么 前边的 ...

  6. nginx基础概念

    nginx基础概念(100%) connection¶ 在nginx中connection就是对tcp连接的封装,其中包括连接的socket,读事件,写事件.利用nginx封装的connection, ...

  7. RGB-D相机视觉SLAM

    RGB-D相机视觉SLAM Dense Visual SLAM for RGB-D Cameras 开源代码地址:  vision.in.tum.de/data/software/dvo 摘要 本文提 ...

  8. 激光雷达数据到云cloud

    激光雷达数据到云cloud 在美国地质调查局的3D提升计划(3DEP)被激发到一个新的方式可用性宣布从3DEP仓库的访问和处理激光雷达点云数据. 3DEP一直在美国使用光检测和测距(激光)技术获取三维 ...

  9. 那些年,我们一起做过的KNX智能化控制经典案例!

    那些年,我们一起做过的KNX经典案例! 光阴之箭已经穿越年轮,抵达2021 GVS在2008年加入KNX国际协会,成为中国首批引进KNX标准的企业,此后,还率先研发出基于KNX的核心协议栈,定标准,做 ...

  10. adb基础命令

    adb运行原理: 启动一个 adb 客户端时,此客户端首先检查是否有已运行的 adb 服务器进程.如果没有,它将启动服务器进程.当服务器启动时,它与本地 TCP 端口 5037 绑定,并侦听从 adb ...