HTML代码:

<!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代码:

<?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. python3 贪吃蛇小游戏

    贪吃蛇 #!/usr/bin/env python import pygame,sys,time,random from pygame.locals import * # 定义颜色变量 redColo ...

  2. java 实现简单的单点登录

    https://my.oschina.net/leamon/blog/266711 https://serviceturbo-cloud-cn.huawei.com/serviceturbocloud ...

  3. Django(46)drf序列化类的使用(ModelSerializer)

    前言 我们上篇文章使用到了Serializer类,可能有小伙伴说太过复杂,那么本篇就为大家带来更加简便的序列化类ModelSerializer ModelSerializer 先来看下ModelSer ...

  4. TVM性能评估分析(三)

    TVM性能评估分析(三) Figure 1. TVM's WebGPU backend close to native GPU performance when deploying models to ...

  5. 细粒度语义分割:ICCV2019论文解析

    细粒度语义分割:ICCV2019论文解析 Fine-Grained Segmentation Networks: Self-Supervised Segmentation for Improved L ...

  6. ADAS超声波雷达

    ADAS超声波雷达 在倒车入库,慢慢挪动车子的过程中,在驾驶室内能听到"滴滴滴"的声音,这些声音就是根据超声波雷达的检测距离给司机的反馈信息. 倒车雷达系统,英文全称为REVERS ...

  7. 视频系列:RTX实时射线追踪(下)

    视频系列:RTX实时射线追踪(下) Key things from part 4 光线有效载荷是从一个着色器传递到另一个着色器的结构. 这一切都发生在RTX的引擎下. 更小的有效载荷要好得多! 新的D ...

  8. 构造无限级树的框架套路,附上python/golang/php/js实现

    目录 前言 需求 数据 结果 框架 递归框架 迭代框架 递归框架实现 python golang php js 迭代框架实现 python golang php js 前言 框架思维非常重要,和语言无 ...

  9. application/octet-stream二进制流, springboot项目, postman 测试参数设置

    这里使用 原生String接受,之后解析,

  10. 十、构建memcached服务

    装包-------配置----起服务---验证   装包: [root@proxy ~]# yum -y  install   memcached    //安装软件包memcached [root@ ...