PHP 算法之 -- 计算器设计
阅读原文时间:2023年07月09日阅读:3
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入数栈 $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 '
栈满,不能添加'; return; } $this->top++; $this->stack\[$this->top\]=$val; } //出栈的操作,就是把栈顶的值取出 public function pop(){ //判断是否栈空 if($this->top==-1){ echo '
栈空'; return; } //把栈顶的值,取出 $topVal=$this->stack\[$this->top\]; $this->top--; return $topVal; } //显示栈的所有数据的方法. public function showStack(){ if($this->top==-1){ echo '
栈空'; return; } echo '
当前栈的情况是....'; for($i=$this->top;$i>-1;$i--){ echo '
stack\['.$i.'\]='.$this->stack\[$i\]; } } } ?>