加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

PHP基于仓库实现的高级计较器成果示例

发布时间:2021-03-06 02:38:07 所属栏目:编程 来源:网络整理
导读:本篇章节讲授PHP基于仓库实现的高级计较器成果。供各人参考研究详细如下: 当我们获得一个字符串运算式该怎样去得出它的运算功效呢? 这时辰我们就能行使仓库的算法很奇妙的办理这个题目。 思绪是这样的:(我们操作php函数substr轮回去截取这个字

本篇章节讲授PHP基于仓库实现的高级计较器成果。分享给各人供各人参考,详细如下:

当我们获得一个字符串运算式该怎样去得出它的运算功效呢?

这时辰我们就能行使仓库的算法很奇妙的办理这个题目。

思绪是这样的:(我们操作php函数substr轮回去截取这个字符串运算式,依次取出这个字符串的值【我们得从第一个字符开始截取】,我们将开始截取位置设为一个轮回增添的变量,初始化为【$index=0】),同时还必要建设两个栈,一个专门存放数字【$numStack】,一个存放运算符【$operStack】,我们还必要一个可以判定是否是运算标记的函数,将每次截取的值放入这个自界说函数中,返回一个可以区别为数字或运算符的标识,通过对这个标识的判定确定值是数字照旧运算符,是数字就插入数栈,是运算符的话就插入标记栈。插入数栈的话可直接插入,可是标记栈的话必要非凡处理赏罚一下[【假如标记栈为空则直接插入,不为空:我们要将插入的标记与栈内的标记举办运算优先级较量(可以界说一个函数来鉴定标记优先级,把 * 和 / 假定为1 把 + 和 - 假定为0 假设数字大的优先级高,云云就能得出运算符优先级),当待插入的标记优先级小于便是栈内顶端的运算符优先级,就从数栈弹出两个值 标记栈弹出一个运算符 将它们举办运算】

下面是一个php的实例【参考自韩顺平先生的php算法教程】

高级计较器

top==$this->maxSize-1){ echo '
栈满,不能添加'; return; } $this->top++; $this->stack[$this->top]=$val; } //出栈的操纵,就是把栈顶的值取出 public function pop() { //判定是否栈空 if($this->top==-1){ echo '
栈空1'; return; } //把栈顶的值,取出 $topVal=$this->stack[$this->top]; $this->top--; return $topVal; } //表现栈的全部数据的要领. public function showStack() { if($this->top==-1){ echo '
栈空2'; return; } echo '
当前栈的环境是....'; for($i=$this->top;$i>-1;$i--){ echo '
stack['.$i.']='.$this->stack[$i]; } } //判定是否是一个运算符 public function isOper($val) { if ($val=='+'||$val=='-'||$val=='*'||$val=='/') { return true; } } //判定栈是否为空 public function isEmpty() { if ($this->top==-1) return true; } /** * 较量运算符的优先级 * 我把 * 和/运算符的优先级看作1 * +和- 看作0 * 通过它们之间的较量就能得出它们的优先级谁更高 */ public function PRI($oper) { if ($oper=='*'||$oper=='/') { return 1; } else if ($oper=='+'||$oper=='-') { return 0; } } //返回栈顶端的值 public function getTop() { return $this->stack[$this->top]; } //计较 public function getResult($num1,$num2,$oper) { switch ($oper) { case '+': $res = $num2+$num1; break; case '-': $res = $num2-$num1; break; case '*': $res = $num2*$num1; break; case '/': $res = $num2/$num1; break; } return $res; } } //必要举办运算的表达式 $str = '12+5*2+3-5*2'; //字符串的指针 $index = 0; //声明一个用于组合接洽数字的变量 $keepNum = ''; //界说一个数栈和一个标记栈 $numsStack=new MyStack(); $operStack=new MyStack(); while (true) { $val = mb_substr($str,$index,1); //假如是一个标记就入标记栈 不然入数栈 if ($operStack->isOper($val)==true) { //标记入栈前必要判定一下 栈为空直接入栈 不为空必要较量当前运算符与栈顶端的运算符 //假如当前运算符的优先级低于栈内的 则必要运算 if ($operStack->isEmpty()) { $operStack->push($val); } else { while (!$operStack->isEmpty()&&$operStack->PRI($val)<=$operStack->PRI($operStack->getTop())) { //当前标记的优先级要直到高于栈内的时辰才气入栈 不然要计较 //当前运算符的优先级低于栈内的 则运算 $num1 = $numsStack->pop(); $num2 = $numsStack->pop(); $oper = $operStack->pop(); $res = $numsStack->getResult($num1,$oper); //计较完毕将功效入栈 $numsStack->push($res); } //把当前这个标记再入标记栈 $operStack->push($val); } } else { //思量假如是持续数字的题目 $keepNum.=$val; //先判定是否已经到字符串最后.假如已经到最后,就直接入栈. if ($index==mb_strlen($str)-1) { $numsStack->push($keepNum);//是数字直接入栈 } else { //要判定一下$ch字符的下一个字符是数字照旧标记. if ($operStack->isOper(mb_substr($str,$index+1,1))) { $numsStack->push($keepNum); $keepNum=''; } } } $index++;//让$index指向下一个字符. if ($index==mb_strlen($str)) break;//已扫描到字符串的末端 就退出while轮回 } /* 4. 当扫描完毕后,就依次弹出数栈和标记栈的数据,并计较,最终留在数栈的值,就是运算功效,只有标记栈不空就一向计较 */ while (!$operStack->isEmpty()) { $num1 = $numsStack->pop(); $num2 = $numsStack->pop(); $oper = $operStack->pop(); $res = $numsStack->getResult($num1,$oper); //计较完毕将功效入栈 $numsStack->push($res); } //当退出while后,在数栈必然有一个数,这个数就是最后功效 echo $str.'='.$numsStack->getTop(); ?>

PS:这里再为各人保举几款计较器材供各人进一步参考小心:

在线一元函数(方程)求解计较器材:

科学计较器在线行使_高级计较器在线计较:

在线计较器_尺度计较器:

更多关于PHP相干内容感乐趣的读者可查察本站专题:《》、《》、《》、《》、《》、《》及《》

但愿本文所述对各人PHP措施计划有所辅佐。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读