首页 > php教程 > PHP源码 > 正文

四则运算表达式转换为后缀表达式

PHP中文网
发布: 2016-05-25 16:58:41
原创
1407人浏览过

四则运算表达式(中缀表达式)转换为后缀表达式:
如中缀表达式9 + ( 3 - 1 ) * 3 + 10 / 2,对应的后缀表达式是9 3 1 - 3 * + 10 2 / +
ps:逻辑实现了,要下班了,代码有些乱,明天再来优化。

<?php
function suffix($str, &$stack, &$newStrList){

//如果是数字则输出
if(is_numeric($str)){
 $newStrList .= $str . ' ';
}
//如果是左括号则入栈
 else if($str == '('){
 $stack[] = $str;
}
//如果是右括号则将最近的左括号之前的所有数据出栈
 else if($str == ')'){
 while($arrPop = array_pop($stack)){
 if($arrPop == '('){
break;
}
 $newStrList .= $arrPop . ' ';
}
}
//如果是加减乘除则判断与栈顶符号优先级
 else if(in_array($str, array('+', '-', '*', '/')) && count($stack) > 0){
 $key = (count($stack) - 1);
 if(in_array($stack[$key], array('+', '-', '*', '/'))){
 if(checkPriority($str, $stack[$key]) != 1){
 for($i=$key; $i>=0; $i--){
 if($stack[$i] == '('){
break;
}
 $newStrList .= $stack[$i] . ' ';
unset($stack[$i]);
 $stack = array_values($stack);
}
 $stack[] = $str;
}else{
 $stack[] = $str;
}
}else{
 $stack[] = $str;
}
}else{
 $stack[] = $str;
}
}

/**
 * 判断运算符的优先级
 * @param $operatorA
 * @param $operatorB
 * @return A大于B返回1,A等于B返回0,A小于B返回-1
*/
function checkPriority($operatorA, $operatorB){
switch($operatorA){
 case '+':
 case '-':
 if($operatorB == '+' || $operatorB == '-'){
 return 0;
 }else if($operatorB == '*' || $operatorB == '/'){
 return -1;
}
break;
 case '*':
 case '/':
 if($operatorB == '+' || $operatorB == '-'){
 return 1;
 }else if($operatorB == '*' || $operatorB == '/'){
 return 0;
}
break;
default:
exit('error');
}
}

$stack = array();
$newStrList = '';
$strList = '9 + ( 3 - 1 ) * 3 + 10 / 2';
$strList = explode(' ', $strList);
foreach($strList as $str){
 if($str == ' '){
continue;
}
 suffix($str, $stack, $newStrList);
}
$stack = array_reverse($stack);
foreach($stack as $s){
 $newStrList .= $s . ' ';
}
echo $newStrList;
登录后复制
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号