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. java 文件上传下载

    翻新十年前的老项目,文件上传改为调用接口方式,记录一下子~~~ java后台代码: //取配置文件中的上传目录 @Value("${uploadPath}") String pat ...

  2. CSS定位特性

    CSS属性书写顺序 布局定位属性:display / position / float / clear / visibility / overflow 自身属性:width / height / ma ...

  3. 安装篇--xshell评估过期解决方法

    打开XSHELL6(以自身版本为准,没有版本限制),弹出如上提示框,解决如下: 1.点击取消,不用卸载原来的,直接进入官网下载安装免费授权的https://www.netsarang.com/ 2.点 ...

  4. unity ab包打包和加载的简单学习示例

    闲着没事结合项目看了下unity AssetBundle打包和使用,写了一些测试例子,需要的可以拿去,导入一个空项目即可 链接:https://pan.baidu.com/s/1H85dnMNkRoW ...

  5. Navigation 实现不同fragment之间的view的共享(含动画过渡)

    以imageView的共享举例 两个fragment都要有各自的imageview视图,id可以不同,但transitonName一定要相同, 都要指定相同的src 例如: fragment A &l ...

  6. KVO后[obj class]与object_getClass(id obj)的结果竟会不一致?

    说说背景,研究下面的代码时,KVO后[obj class]与object_getClass(id obj)的结果竟会不一致? PersonModel *aPersonModel = [[PersonM ...

  7. 解决Maven资源过滤问题

    向pom文件添加如下配置 <build> <resources> <resource> <directory>src/main/java</dir ...

  8. [leetcode] (周赛)869. 重新排序得到 2 的幂

    869. 重新排序得到 2 的幂 枚举排列,然后验证.比较暴力. 其实好一点的做法应该反过来,先把int范围下的2的N幂算出来,然后一个一个验证给出的数能不能拼成. class Solution { ...

  9. Jmeter- 笔记3 - Jmeter录制功能 / 抓包

    http代理服务器录制脚本: 1.新建线程组 2.添加 http代理服务器 元件 3.http代理服务器修改: 1)端口:8899,任意给个无占用的 2)目标控制器:改成刚刚新建的线程组.不改就录制会 ...

  10. 关于MongoDB ObjectId的那些事儿

    ObjectId 是什么? 一句话,ObjectId 是 MongoDB 文档 _id(主键)的默认类型. ObjectId 的组成? ObjectId 使用 12 字节的存储空间,是一个由 24 个 ...