php怎么做计算器类的计算,php--计算器的算法实现(-)

该方法只能进行每个数字符号是1位的操作运算。修改见更新。。。

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 '栈满,不能添加';

return; //栈满 返回

}

//先top上移,然后填充栈内容

$this->top++;

$this->stack[$this->top]=$val;

}

//出栈

public function pop(){

if($this->top==-1){

echo '栈111空';

return; //空栈,无数据,返回

}

//取出栈顶的数据,同时把该数据返回,别忘了把top指针下移

$topValue=$this->stack[$this->top];

$this->top--;

return $topValue;

}

//显示栈的所有信息

public function showStack(){

if($this->top==-1){

echo '栈空!';

return;//空栈,无数据,返回

}

//结合堆栈的数据结构,是后进先出类型的,因此从栈顶开始,依次往下读出栈的内容

for($i=$this->top;$i>-1;$i--){

echo 'Stack['.$i.']='.$this->stack[$i].'';

}

}

}

?>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值