php-高级计算器
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-高级计算器的更多相关文章
- 软件工程(QLGY2015)第二次作业点评(随机挑选20组点评)
相关博文目录: 第一次作业点评 第二次作业点评 第三次作业点评 说明:随机挑选20组点评,大家可以看看blog名字,github项目名字,看看那种是更好的,可以学习,每个小组都会反应出一些问题,希望能 ...
- Linux shell 变量 数学 运算
Abstract : 1) Linux shell 中使用 let , [ ] ,(( )) 三种运算符操作 shell 变量进行简单的基本运算: 2)Linux shell 中使用 expr 与 ...
- 如何计算一个字符串表示的计算式的值?——C_递归算法实现
在<C程序设计伴侣>的8.7.3 向main()函数传递数据这一小节中,我们介绍了如何通过main()函数的参数,向程序传递两个数据并计算其和值的简单加法计算器add.exe.这个程序,好 ...
- 三星galaxy s4问题解决及快捷操作
http://blog.csdn.net/pipisorry/article/details/38474827 三星galaxy s4更改锁屏方式时出现故障 屏幕锁定设置除password以外,其它锁 ...
- Lua 解释器
Lua 解释器 警告⚠️:这将是一个又臭又长的系列教程,教程结束的时候,你将拥有一个除了性能差劲.扩展性差.标准库不完善之外,其他方面都和官方相差无几的 Lua 语言解释器.说白了,这个系列的教程实现 ...
- 三星galaxy S4快捷功能
你不知道的s4那些快捷操作全面挖掘 1.截屏:S4有三种截屏方法: 一种是常见的同一时候按住home键和电源键大概2秒左右时间. 另外一种是打开手势感应,设定→我的设备→动作与手势→手掌动作→截取屏幕 ...
- int与byte的区别
Java中涉及byte.short和char类型的运算操作首先会把这些值转换为int类型,然后对int类型值进行运算,最后得到int类型的结果.因此,如果把两个byte类型值相加,最后会得到一个int ...
- php实现单,双向链表,环形链表解决约瑟夫问题
传智播客PHP学院 韩顺平 PHP程序员玩转算法第一季 http://php.itcast.cn 聊天篇: 数学对我们编程来说,重不重要? 看你站在什么样的层次来说. 如果你应用程序开发,对数学要求 ...
- 第4天:scipy库
一.SciPy库概述 1.numpy提供向量和矩阵的相关操作,高级计算器 2.SciPy在统计.优化.插值.数值积分.视频转换等,涵盖基础科学计算相关问题. (额,对统计和概率,数理完全一窍不通) 3 ...
随机推荐
- Java中生成唯一标识符的方法(Day_48)
有时候业务需要生成唯一标识符,但又不能依赖于数据库中自动递增的字段产生唯一ID,比如多表同一字段需要统一一个唯一ID,此时我们就需要用程序来生成一个唯一的全局ID. UUID UUID是指在一台机器上 ...
- JVM-垃圾收集算法基础
目录 目录 前言 手动释放内存导致的问题 垃圾判定方法 哪些对象是垃圾? 引用计数算法 可达性分析法 垃圾收集算法 标记-清除 优点 缺点 优化 标记-复制 优点 缺点 优化 标记-整理 优点 缺点 ...
- 如何不做登录请求而获取cookie到Jmeter里
如何不做登录请求而获取cookie到Jmeter里? 登录被测系统后,按F12,找到如下位置,将这个表格所有信息都复制到Jmeter的HTTP Cookie管理器元件,这样就可以不需要登录,能继续发送 ...
- 关于LSTM核心思想的部分理解
具体资料可以查阅网上,这里提到一些难理解的点.别人讲过的知识点我就不重复了. LSTM 的关键就是细胞状态,按照水平线从左向右运行,如同履带,在整个链上运行. 根据时间t-1,t,t+1,我们可以看出 ...
- 2020年Yann Lecun深度学习笔记(上)
2020年Yann Lecun深度学习笔记(上)
- CentOS 7 部署 node 项目
CentOS 7 部署 node 项目 安装 node 环境 方法一:使用 wget 的方式下载压缩包进行解压 淘宝node镜像地址,进入地址选择自己想要安装的版本 wget https://npm. ...
- Mysql数据库值的添加、修改、删除及清空
3.MySQL数据管理 第一种方式:不太建议,看起来复杂些 -- 学生表的 gradeid 字段,要去引用 年级表的 gradeid -- 定义外键key -- 给这个外键添加约束,(执行引用),RE ...
- 【NX二次开发】点到矢量或直线的垂点
已知p1.p2.v1求p0 求解: 通过P1点和P2点,先求出v2: 使用 UF_VEC3_dot(),v1点乘v2得到P0与P2之间的距离: 使用UF_VEC3_unitize()将v1单位化: p ...
- 从1+1=2来理解Java字节码从1+1=2来理解Java字节码
编译"1+1"代码 首先我们需要写个简单的小程序,1+1的程序,学习就要从最简单的1+1开始,代码如下: 写好java类文件后,首先执行命令javac TestJava.java ...
- 「10.8」simple「数学」·walk「树上直径」
A. Simple 本来以为很难,考场瞎推了推好像会了...... 想起小凯的诱惑,迷?? 首先$n$,$m$,$q$同除$gcd(n,m)$,显然$q$以内的数假如不是$gcd$的倍数,那么一定不能 ...