使用栈完成高级计算器
1.堆栈的概念
一个先入后出(FILO-First In Last Oot)的有序列表。堆栈(stack)的限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,成为(Top),另一端为固定的一端,称为栈底(Bottom)。根据堆栈的定义而知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素(或者取元素)刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。
2.堆栈的实际运用
(1)子程序的调用:在跳往子程序前,会先讲下个指令的地址存到堆栈中,直到子程序执行完毕后再讲地址取出,回到原来的程序中。
(2)处理递归调用:和子程序的调用类似,只是除了存储下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。
(3)表达式的转换与求值。 //综合的计算器
(4)二叉树的遍历。 //前序遍历,后序遍历,中序遍历
(5)图形的深度优先(depth-first)搜索法。 //搜索算法
PHP实现基础栈及计算器
//+------------------------------------------------------------------------
//+ 基础:自定义栈类
//+------------------------------------------------------------------------
/*** 基础栈类*/
class MyStack{protected $top = -1;protected $list = [];// 入栈public function push($val){$this->list[++$this->top] = $val;}// 出栈public function pop(){return $this->list[$this->top--];}// 显示全部public function showAll(){for ($i=$this->top;$i>=0;$i--){echo "第 {$i} 层:" . $this->list[$i] . "<br/>";}}
}// 用例
$myStack = new MyStack();
$myStack->push('《设计原本》');
$myStack->push('《重构》');
$myStack->push('《人月神话》');
$myStack->push('《代码大全》');$pop_value = $myStack->pop();
echo '弹出:'.$pop_value."<br/><br/>";$myStack->showAll();//+------------------------------------------------------------------------
//+ 扩展:使用栈的思路实现计算器类
//+------------------------------------------------------------------------
/*** 扩展计算器栈*/
class CalculatorStack extends MyStack{// 获取栈顶元素的值public function topVal(){if( $this->top<0 ){return null;}return $this->list[$this->top];}
}
/*** 扩展计算器运算符栈*/
class OperStack extends CalculatorStack{// 最新运算符的优先级与上一个运算符的优先级对比public function comparePri($newOper){$lastOper = $this->topVal();if( $lastOper==null ){return false;}$newOperPri = $this->PRI($newOper);$lastOperPri = $this->PRI($lastOper);if( $newOperPri>$lastOperPri ){return false;}return true;}// 获取运算符的优先级private function PRI($oper){if( in_array($oper, ['*','/']) ){return 1;}elseif( in_array($oper, ['+','-']) ){return 0;}else{throw new \Exception('当前运算符不支持!');}}
}/*** 计算器*/
class Calculator{private $numStack; // 数字栈private $operStack; // 运算符栈private $oper_str;public function __construct($oper_str){$this->numStack = new CalculatorStack();$this->operStack = new OperStack();$this->oper_str = $oper_str;}// 执行运算public function exec(){// 拆解运算字符串,依据类型分别入栈$strlen = strlen($this->oper_str);$start = 0;while (true){$new_str = substr($this->oper_str, $start, 1);if( is_numeric($new_str) ){// 获取后面一个字符的类型,如果是数字,则拼接到当前的数字后面while (true){$next_str = substr($this->oper_str, $start+1, 1);if( is_numeric($next_str) ){$new_str .= $next_str;$start++;}else{break;}}$this->numStack->push($new_str);$start++;}else{$this->compareOperation($new_str);$start++;}if($start>=$strlen)break;}// 对栈中剩余数据进行运算$this->doOperation();// 数字栈的最后一个值,就是运算结果return $this->numStack->pop();}// 获取上一个运算符,如果优先级低于上一个,则进行依次出栈运算public function compareOperation($new_str){if( $this->operStack->comparePri($new_str) ){// 进入出栈运算$this->doOperation();// 再进行检测if( $this->operStack->comparePri($new_str) ){$this->compareOperation($new_str);}}$this->operStack->push($new_str);}// 执行一次出栈运算public function doOperation(){$num_01 = $this->numStack->pop();$num_02 = $this->numStack->pop();$oper = $this->operStack->pop();switch ($oper){case '*':$operValue = $num_02 * $num_01;break;case '/':$operValue = $num_02 / $num_01;break;case '+':$operValue = $num_02 + $num_01;break;case '-':$operValue = $num_02 - $num_01;break;}// 将运算结果重新入数字栈$this->numStack->push($operValue);}
}$oper_str = '300+2*6-20';
$calculator = new Calculator($oper_str);
$calc_val = $calculator->exec();
echo "<br/><br/><br/>公式 {$oper_str} 的运算结果为:{$calc_val}";
参考:
https://blog.csdn.net/wenximalong/article/details/8299749
https://blog.csdn.net/wenximalong/article/details/8300377
https://blog.csdn.net/wenximalong/article/details/8302009
https://blog.csdn.net/wenximalong/article/details/8302659
使用栈完成高级计算器相关推荐
- 栈实现高级计算器的思路分享
2019独角兽企业重金招聘Python工程师标准>>> 1.建立两个栈:valueStack(数值栈).operStack(运算符栈) 2.程序扫描表达式,当发现当前的这个字符是数字 ...
- PHP高级计算器的过程,PHP使用栈完成高级计算器-接上文模拟栈
距离上一篇文章PHP模拟栈,小梦就答应了小伙伴们要使用栈来完成一个实战的例子,今天就给大家带来了这个例子,让大家更加深入理解它的使用场景! 当出现'3+4*3-2'这个字符串的时候,我们头脑中会有很多 ...
- java高级计算器_高级计算器[Java版]
import java.util.Scanner; /* * time: 2012年11月17日 11:34:10 * content: 高级计算器 * author: 覃唐 ...
- PHP高级计算器的过程,PHP基于堆栈实现的高级计算器功能示例
PHP基于堆栈实现的高级计算器功能示例 发布于 2017-10-14 13:38:26 | 108 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext ...
- php利用堆栈 实现高级计算器
当我们得到一个字符串运算式该如何去得出它的运算结果呢? 这时候我们就能使用堆栈的算法很巧妙的解决这个问题. 思路是这样的:(我们利用php函数substr循环去截取这个字符串运算式,依次取出这个字符串 ...
- 七、使用栈实现综合计算器(中缀表达式)
使用栈实现综合计算器(中缀表达式) 1.栈的实际需求 请输入一个表达式,计算式:[722-5+1-5+3-3] ,计算出结果 计算机底层是如何运算得到结果的? 注意不是简单的把算式列出运算,因为我们看 ...
- 数据结构:栈实现简易计算器
文章目录 栈实现简易计算器 思路 代码实现 栈结构 运算方法 测试 栈实现简易计算器 之前的博客已经介绍了栈数据结构,栈有着数据先进后出的特点,因此用于实现简易计算器时相当方便.本博文中将介绍如何用栈 ...
- 【Java数据结构与算法】第四章 栈实现综合计算器
第四章 栈实现综合计算器 文章目录 第四章 栈实现综合计算器 一.栈 1.介绍 2.应用场景 3.思路 4.代码实现 二.综合计算器 v1.0 1.思路 2.代码实现 三.前缀.中缀和后缀表达式规则 ...
- 【基本办公软件】万彩办公大师教程丨高级计算器的应用
横屏显示高级计算器,含加减乘除.百分比.数值记忆储存.清除等标准计算,支持三角函数,反三角函数,指数,对数函数,幂函数,求余函数,阶乘等科学计算,实现逻辑移位指令.逻辑运算.十六进制.十进制.二进制快 ...
- 【数据结构与算法 6】栈实现综合计算器
一.栈 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放 ...
最新文章
- 一次I/O问题引发的P0重大故障[改版重推]
- 中原银行数字化营销体系建设实践
- 字符串的原样输入输出python_Python字符串输入输出简述
- 海洋工作室——网站建设专家:How to check the SQL statement execute time on SQL Server ?...
- linux 安装wdcp控制面板
- 牛客网与leetcode刷题(高频题中简单or中等的)
- 移动端中如何检测设备方向的变化?
- SQL 行转列,列分行,行合并列(转)
- 《深入解析Windows操作系统》--第二章 系统结构
- 程序员如何在春节假期避免加班?
- ios tweak之binary not signed (use ldid -S)问题解决
- Leetcode130.被围绕的区域
- 第5章 深度学习和卷积神经网络
- MacBooster 8 Pro for Mac(系统清理优化软件)
- gff3转mysql_GBrowse的安装和使用
- 如何搭建靠谱的测试环境
- 揭秘第三方支付包含哪些业务 | 牌照角色篇
- jQuery插件库超级好用库
- tar命令下的--exclude
- 数据库原理-并发控制(2-封锁)
热门文章
- 牛客 检测命令是否正确
- 电脑重装系统后谷歌浏览器连不上网的解决方案
- java long型时间戳_深入理解java long 存储时间戳
- Java读取图片 cmyk转rgb
- java 实现 PDF 转 TIF 【彩色压缩版】
- [系统安全] 一.什么是逆向分析、逆向分析基础及经典扫雷游戏逆向
- 图片alt属性添加方法
- CF #595 Div.3 F. Maximum Weight Subset//树形dp
- 细说共模干扰和差模干扰(四个腿的电感是什么?有什么作用?)
- 2022淘宝双十一优惠券如何叠加使用?淘宝双十一优惠券叠加规则介绍