php使用逆波兰算法实现四则运算器
来源:互联网 发布:考勤表制作软件 编辑:程序博客网 时间:2024/05/27 14:12
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">逆波兰表示法,俗称后缀表示法。</span>
曾经被别人问过,四则运算器的实现,当时仅仅是算的两个数的,周日研究了下四则运算表达式,看到逆波兰算法,从看算法思路到实现并验证花了近2个多小时,怕以后忘掉,所以记录下来,放到工具包中。
逆波兰算法思路,重点是理解大括号的压栈和出栈,这里就不细说了。
有个博客写的不错,入口:http://blog.sina.com.cn/s/blog_3c6889fe0100sb84.html
下面是PHP代码:
<?php/** * Created by PhpStorm. * User: lzf * Date: 15/6/28 * Time: 21:40 */error_reporting(0);$expr = '1+(5-6*7)*9';$expr = '2+45+6/2-45+(23-4)*5';$expr = '2+45+6/2-20';//运算符栈,在栈里插入最小优先级的运算符,避免进入不到去运算符比较的循环里$opArr = array('#');//运算数栈;$oprandArr = array();//运算符优先级$opLevelArr = array( ')' => 2, '(' => 3, '+' => 4, '-' => 4, '*' => 5, '/' => 5, '#' => 1);$bolanExprArr = array();$exprLen = strlen($expr);$inop = false;$opNums = "";//解析表达式for($i = 0;$i <= $exprLen;$i++){ $char = $expr[$i]; //获取当前字符的优先级 $level = intval($opLevelArr[$char]); //如果大于0,表示是运算符,否则是运算数,直接输出 if($level > 0){ $inop = true; //如果碰到左大括号,直接入栈 if($level == 3){ array_push($opArr,$char);continue; } //与栈顶运算符比较,如果当前运算符优先级小于栈顶运算符,则栈顶运算符弹出,一直到当前运算符优先级不小于栈顶 while($op = array_pop($opArr)){ if($op){ $currentLevel = intval($opLevelArr[$op]); if($currentLevel == 3 && $level == 2) { break; }elseif($currentLevel >= $level && $currentLevel != 3){ array_push($bolanExprArr,$op); }else{ array_push($opArr,$op); array_push($opArr,$char); break; } } } }else{ //多位数拼接成一位数 $opNums .= $char; if($opLevelArr[$expr[$i+1]] > 0){ array_push($bolanExprArr, $opNums); $opNums = ""; } }}array_push($bolanExprArr, $opNums);//输出剩余运算符while($leftOp = array_pop($opArr)){ if($leftOp != '#'){ array_push($bolanExprArr,$leftOp); }}//计算逆波兰表达式。foreach($bolanExprArr as $v){ if(!isset($opLevelArr[$v])){ array_push($oprandArr,$v); }else{ $op1 = array_pop($oprandArr); $op2 = array_pop($oprandArr); eval("\$result = $op2 $v $op1;"); array_push($oprandArr,$result); }}echo $result;
如有什么错误,请大家批评指证。
0 0
- php使用逆波兰算法实现四则运算器
- C#实现四则运算器
- Java实现简易四则运算器
- JavaScript实现四则运算器程序
- JS实现加减乘除四则运算器
- 四则运算器
- 利用堆栈实现四则表达式运算器
- 实现逆波兰算法
- 逆波兰运算器浮点求值(c++版本)
- C语言四则运算器
- 简易四则运算器
- C语言第六篇:用switch语句实现四则运算器
- 逆波兰表达式算法实现
- 逆波兰算法的实现
- 一个简单的四则运算器
- 我的Qt学习之路——简易四则运算器的实现
- 利用栈实现逆波兰算法
- 利用逆波兰式进行四则表达式运算
- angularjs ajax post跨域提交数据
- VNC远程登陆ubuntu12.04不能显示桌面, 而只有一个Terminal窗口
- 个人理财计划
- Android 基于google Zxing实现二维码、条形码扫描
- 教程——Basys3开发板实现示波器设计
- php使用逆波兰算法实现四则运算器
- 黑马程序员-OC语言-#pragma mark指令的使用(听课笔记)
- SAT填空题答题的两个注意事项介绍
- #308 (div.2) B. Vanya and Books
- 设计模式--浅谈原型模式
- Java基础——IO流(下)
- css 中 id 和 class 的区别
- 设计模式--浅谈模板方法模式
- JavaScript权威指南_112_第15章_脚本化文档_15.2-选取文档元素-概述