php--计算器的算法实现(-)

该方法只能进行每个数字符号是1位的操作运算。修改见更新。。。
<html>
<head><title>php--计算器的算法实现(-)</title></head>
<body>
<?php
$exp='3*9*9';
echo $exp.'=';
$numStack=new MyStack();
$opeStack=new MyStack();

$index=0;
while(true){
 $ch=substr($exp,$index,1);
//判断是否是字符
  if($opeStack->isOper($ch)){
     //是运算符
	/**
	3.如果发现是运算符
	3.1 如果符号栈为空,就直接入符号栈

	3.2. 如何符号栈,不为空,就判断
	如果当前运算符的优先级小于等于符号栈顶的这个运算符的优先级,就计算,并把计算结果入数栈.然后把当前符号入栈
	3.3 如何符号栈,不为空,就判断
	如果当前运算符的优先级大于符号栈顶的这个运算符的优先级,就入栈.

		*/
  	//如何符号栈,不为空,
    if($opeStack->isEmpty()==true){
      $opeStack->push($ch);
    }else{
	//符号栈不为空
	//如果当前运算符的优先级小于等于符号栈顶的这个运算符的优先级,就计算
	$chPRI=$opeStack->PRI($ch);
	$stackPRI=$opeStack->PRI($opeStack->getTop());
	if($chPRI<=$stackPRI){
	 $num1=$numStack->pop();
	 $num2=$numStack->pop();
	 $ope=$opeStack->getTop();
	 $res=$opeStack->getResult($num1,$num2,$ope);
     $numStack->push($res);
    // $opeStack->push($ch);
	}else{
	 $opeStack->push($ch);
	}
    }//if结束
   }else{
    $numStack->push($ch);
   }

    ++$index;
  	if($index==strlen($exp)){
	 break;
				
	}

}

   while(!$opeStack->isEmpty()){

		$num1=$numStack->pop();
		$num2=$numStack->pop();
		$ope=$opeStack->pop();
		$res=$opeStack->getResult($num1,$num2,$ope);
		$numStack->push($res);
   }
echo $numStack->getTop();


 class MyStack{
	 private $top=-1; //模拟栈底,指向-1
	 private $maxSize=15; //模拟栈的容量为5
	 private $stack=array();//用来数组来模拟,想数组内填入栈的内容
	  //判断是否是运算符
     public function isOper($ch){
	  if($ch=='+'||$ch=='-'||$ch=='*'||$ch=='/'){
	  return true;
	  }else{
	  return false;
	  }
     }
	  //判断栈是否为空

     public function isEmpty(){
				if($this->top==-1){
					return TRUE;
				}else{
					return FALSE;
				}
	 }
	 //判断符号的优先级
	 public function PRI($ch){
	 if($ch=='*'||$ch=='/'){
	 return 1;
	 }else if($ch=='+'||$ch=='-'){
	 return 0;
	 }
	 }
	//获得栈顶的值
	public function getTop(){
	return $this->stack[$this->top];
	}
	//计算数值
	public function getResult($num1,$num2,$ope){
	$res=0;
	switch($ope){
	case '+':
		$res=$num1+$num2;
	   break;
	case '-':
		$res=$num2-$num1;
	   break;
	case '*':
		$res=$num1*$num2;
         break;
	case '/':
		$res=$num2/$num1;
	 break;
//erqiqu huibohuayuan   155171111 86
	}
    return $res;
	}
	  //入栈操作
     public function push($val){
	 ///先判断栈是否已满
	 if($this->top==$this->maxSize-1){
	 echo '栈满,不能添加</br>';
     return; //栈满 返回
	 }
	 //先top上移,然后填充栈内容
	 $this->top++;
     $this->stack[$this->top]=$val;
	 } 
	 //出栈
	 public function pop(){
	 if($this->top==-1){
	 echo '栈111空</br>';
     return; //空栈,无数据,返回
	 }
	 //取出栈顶的数据,同时把该数据返回,别忘了把top指针下移
	 $topValue=$this->stack[$this->top];
	 $this->top--;
	 return $topValue;

	 }
	 //显示栈的所有信息
	 public function showStack(){
	 
	 if($this->top==-1){
	 echo '栈空!</br>';
	 return;//空栈,无数据,返回
	 }
	 //结合堆栈的数据结构,是后进先出类型的,因此从栈顶开始,依次往下读出栈的内容
	 for($i=$this->top;$i>-1;$i--){
		echo 'Stack['.$i.']='.$this->stack[$i].'</br>'; 
	 }
	 }
 }
?>
</body>
</html>

转载于:https://my.oschina.net/mojiadan/blog/114197

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值