PHP 算法之 -- 计算器设计
生活随笔
收集整理的這篇文章主要介紹了
PHP 算法之 -- 计算器设计
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
<?php//$exp='300+20*6-20'; $exp='71*2-50*3-3-67*6+80'; //14-15-3=-4//定義一個數棧和一個符號棧$numsStack=new MyStack();$operStack=new MyStack();$keepNum='';//專門用于拼接多位數的字符串$index=0;//$index就是一個掃描的標記while(true){//依次取出字符$ch=substr($exp,$index,1);//判斷$ch是不是一個運算符號.if($operStack->isOper($ch)==true){//是運算符/**3.如果發現是運算符3.1 如果符號棧為空,就直接入符號棧3.2. 如何符號棧,不為空,就判斷如果當前運算符的優先級小于等于符號棧頂的這個運算符的優先級,就計算,并把計算結果入數棧.然后把當前符號入棧3.3 如何符號棧,不為空,就判斷如果當前運算符的優先級大于符號棧頂的這個運算符的優先級,就入棧.*/if($operStack->isEmpty()){$operStack->push($ch);}else{while(!$operStack->isEmpty() && $operStack->PRI($ch)<=$operStack->PRI($operStack->getTop())){ //從數棧依次出棧兩個數.$num1=$numsStack->pop();$num2=$numsStack->pop();//再從符號棧取出一個運算符$oper=$operStack->pop();//這里還需要一個計算的函數$res=$operStack->getResult($num1,$num2,$oper);//把$res入數棧<font size="" color=""></font>$numsStack->push($res);}//把當前這個符號再入符號棧.//???????問題,一會在解決$operStack->push($ch); }}else{$keepNum.=$ch; //先判斷是否已經到字符串最后.如果已經到最后,就直接入棧.if($index==strlen($exp)-1){$numsStack->push($keepNum);}else{//要判斷一下$ch字符的下一個字符是數字還是符號.if($operStack->isOper(substr($exp,$index+1,1))){ $numsStack->push($keepNum);$keepNum='';}} }$index++;//讓$index指向下一個字符.//判斷是否已經掃描完畢if($index==strlen($exp)){break; } }while(!$operStack->isEmpty()){$num1=$numsStack->pop();$num2=$numsStack->pop();$oper=$operStack->pop();$res=$operStack->getResult($num1,$num2,$oper);$numsStack->push($res);}//當退出while后,在數棧一定有一個數,這個數就是最后結果echo $exp.'='.$numsStack->getTop();//這是我們昨天寫的一個棧.class MyStack{private $top=-1;//默認是-1,表示該棧是空的private $maxSize=5;//$maxSize表示棧最大容量private $stack=array();////計算函數public function getResult($num1,$num2,$oper){$res=0;switch($oper){case '+':$res=$num1+$num2;break;case '-':$res=$num2-$num1;break;case '*':$res=$num1*$num2;break;case '/':$res=$num2/$num1;break;}return $res;}//返回棧頂的字符,只是取出,但是不出棧public function getTop(){return $this->stack[$this->top];}//判斷優先級的函數public function PRI($ch){if($ch=='*'||$ch=='/'){return 1;}else if($ch=='+'||$ch=='-'){return 0;}}//判斷棧是否為空public function isEmpty(){if($this->top==-1){return TRUE;}else{return FALSE;}}//增加一個函數[提示,在我們開發中,根據需要可以靈活的增加你需要的函數]//判斷是不是一個運算符public function isOper($ch){if($ch=='-'||$ch=='+'||$ch=='*'||$ch=='/'){return TRUE;}else{return FALSE;}}//入棧的操作public function push($val){//先判斷棧是否已經滿了if($this->top==$this->maxSize-1){echo '<br/>棧滿,不能添加';return;}$this->top++;$this->stack[$this->top]=$val;}//出棧的操作,就是把棧頂的值取出public function pop(){//判斷是否???/span>if($this->top==-1){echo '<br/>???/span>';return;}//把棧頂的值,取出$topVal=$this->stack[$this->top];$this->top--;return $topVal;}//顯示棧的所有數據的方法.public function showStack(){if($this->top==-1){echo '<br/>棧空';return;}echo '<br/>當前棧的情況是....';for($i=$this->top;$i>-1;$i--){echo '<br/> stack['.$i.']='.$this->stack[$i];}}} ?>轉載于:https://www.cnblogs.com/songyanan/p/10628436.html
總結
以上是生活随笔為你收集整理的PHP 算法之 -- 计算器设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ajax设置自定义请求头的两种方法
- 下一篇: PHP中一些常用知识点