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 语言的主要特性
Java语言是简单的 Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用. Java丢弃了C++中很少使用的.很难理解的.令人迷惑的那些特性,如操作符重载.多继承.自动的强 ...
- 8.5-7 mkfs、dumpe2fs、resize2fs
8.5 mkfs:创建Linux文件系统 mkfs命令用于在指定的设备(或硬盘分区等)上创建格式化并创建文件系统,fdisk和parted等分区工具相当于建房的人,把房子(硬盘),分成几居室( ...
- Keil编译后的Code,RO,RW,ZI分别表示什么以及和芯片Flash、SRAM的对应关系
在使用keil开发STM32应用程序时,点击Build后在Build Output窗口中经常会有如下信息:<ignore_js_op> 以前一直好奇这几个参数和实际使用的STM32芯片中F ...
- Linux下安装JDK 1.8你必须知道的糟心事
来源:Atstudy网校 1.简介 在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还的一个一个的摸索尝试,而且网上大多数都是一些Or ...
- java面试一日一题:java中的垃圾回收器
问题:请讲下java中垃圾回收器有哪些? 分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器 回答要点: 主要从以下几点去考虑, 1.垃圾回收器的种类 2.每种垃圾回收器的着重点是什么 前边的 ...
- nginx基础概念
nginx基础概念(100%) connection¶ 在nginx中connection就是对tcp连接的封装,其中包括连接的socket,读事件,写事件.利用nginx封装的connection, ...
- RGB-D相机视觉SLAM
RGB-D相机视觉SLAM Dense Visual SLAM for RGB-D Cameras 开源代码地址: vision.in.tum.de/data/software/dvo 摘要 本文提 ...
- 激光雷达数据到云cloud
激光雷达数据到云cloud 在美国地质调查局的3D提升计划(3DEP)被激发到一个新的方式可用性宣布从3DEP仓库的访问和处理激光雷达点云数据. 3DEP一直在美国使用光检测和测距(激光)技术获取三维 ...
- 那些年,我们一起做过的KNX智能化控制经典案例!
那些年,我们一起做过的KNX经典案例! 光阴之箭已经穿越年轮,抵达2021 GVS在2008年加入KNX国际协会,成为中国首批引进KNX标准的企业,此后,还率先研发出基于KNX的核心协议栈,定标准,做 ...
- adb基础命令
adb运行原理: 启动一个 adb 客户端时,此客户端首先检查是否有已运行的 adb 服务器进程.如果没有,它将启动服务器进程.当服务器启动时,它与本地 TCP 端口 5037 绑定,并侦听从 adb ...