当前位置: 首页 > 后端技术 > PHP

用ChainStack实现简单四算术计算器(php版)

时间:2023-03-29 20:08:32 PHP

Stack是一个线性表,只在表尾插入和删除。栈的应用有很多,比如常见的递归、计算机表达式求值等,下面我们利用栈来实现一个简单的四算术计算器。列举本文思路:实现链栈的数据结构及其操作中缀表达式到后缀表达式的求值后缀表达式的求值1.首先实现一个链栈。//定义栈类的数据结构Node{public$symbol;公共$下一个;公共函数__construct($symbol,$next){$this->symbol=$symbol;$this->next=$next;}}//初始化栈并生成头节点函数initStack(&$node){$node=newNode('',null);}//推送函数push(Node&$node,$symbol){$p=新节点($symbol,null);$p->next=$node->next;$node->next=$p;}//弹出函数pop(Node&$node,&$symbol){if(null==$node->next){echo"空栈\n";返回;}$q=$node->下一个;$symbol=$q->符号;$node->next=$node->next->next;unset($q);}2.其次,利用第一步实现的链接栈,将中缀表达式转换为后缀表达式。//获取运算符的优先级functionget_priority($symbol){switch($symbol){case'(':$priority=3;break;case'*':case'/':$priority=2;break;case'+':case'-':$priority=1;break;case')':$priority=0;休息;默认值:$priority=0;休息;}返回$优先级;栈,遇到'('就停止functionclear_stack(&$list){$res='';while(null!=$list->next){if('('!=$list->next->symbol){pop($list,$item);$res.=$item;}else{pop($list,$item);return$res;}}return$res;}//中缀表达式转后缀表达式函数middle_to_back($middle_expression){initStack($list);$back_expression='';$length=strlen($middle_expression);for($i=0;$i<$length;$i++){$symbol=$middle_expression[$i];if(''!=$symbol){if(is_numeric($symbol)){//数字直接输出$back_expression.=$symbol;}else{//非数值比较优先级$stack_top_priority=get_priority(null==$list->next?'':$list->next->symbol);$current_symbol_priority=get_priority($symbol);if($current_symbol_priority>$stack_top_priority){//优先推送($list,$symbol);}else{$output=clear_stack($list);$back_expression.=$output;if(')'!=$symbol){push($list,$symbol);}}}}}while(null!=$list->next){//清空堆栈pop($list,$item);$back_expression.=$item;}return$back_expression;}3.接下来我们使用第一步实现的链栈和第二步得到的后缀计算最终值的表达式//是否为四次算术运算符号functionis_arithmetic_symbol($symbol){$arithmetic_symbols=array('+','-','*','/');if(in_array($symbol,$arithmetic_symbols)){返回true;}else{返回错误;}}//计算后缀表达式的值functioncalculate($expression){$stack=newNode('',null);$length=strlen($expression);for($i=0;$i<$length;$i++){if(''!=$expression[$i]){//如果为空则跳过if(is_numeric($expression[$i])){push($stack,$expression[$i]);}elseif(is_arithmetic_symbol($expression[$i])){pop($stack,$n1);弹出($堆栈,$n2);$res=get_result($n2,$n1,$expression[$i]);推($堆栈,$res);}else{echo"符号错误,退出";出口();}}}$value=$stack->next->symbol;return$value;}最后,我们测试实现的计算器。函数main(){$back_expression=middle_to_back('((1+2)*3-4)*5');$result=计算($back_expression);echo"后缀表达式的值为:".$back_expression,PHP_EOL;回声“结果:”。$result,PHP_EOL;}main();得到的结果如下:简单的计算器实现了!~~~(代码中有一些细节没有判断,还望读者理解,欢迎批评指正,谢谢~)