实现一个计算器

9+2*8-2

30+2*6-1

7*2-3*5-2

实现思路:

1、程序扫描表达式

2、发现是数字就入数字栈(这里要特别注意,当数字不是一位的情况)

3.如果发现是运算符

a)如果符号栈为空,就直接入符号栈

b)如何符号栈,不为空,就判断

I)   如果当前运算符的优先级小于等于符号栈顶的这个运算符的优先级,就计算,并把计算结果入数栈.然后把当前符号入栈

这里要特别注意比如13-11-2的例子!当两个减号优先级相同时,如果不把已有的减号计算,就会计算成先计算11-2再用13-9=4的错误答案。所以这个地方是个while循环。

II)   如果当前运算符的优先级大于符号栈顶的这个运算符的优先级,就入栈.

4、最后把所有的数都出栈,计算,留在数栈中的值就是最后结果

<html><head><meta http-equiv='content-type' content='text/html;charset=gbk'/></head>
<?php//  $exp=$_GET['exp'];
//  $exp='9+2*8-3'; //[人眼睛3+12-2 =>15-2=>13]
//   $exp='304+10*6-10';$exp='71*2-50*3-3-67*6+80';//-333$numsStack=new MyStack();$operStack=new MyStack();$keepNum='';//专门用于拼接数字$index=0;//$index就是一个扫描标记while(true){//依次取出字符$ch=substr($exp,$index,1);//判断$ch是不是一个运算符if($operStack->isOper($ch)==TRUE){//是运算符/***/if($operStack->isEmpty()){               $operStack->push($ch);           }else{          /*//需要一个函数来获取运算符的优先级 *和/的优先级为1 ,+和-为0               $chPRI=$operStack->PRI($ch);$stackPRI=$operStack->PRI($operStack->getTop());if($chPRI<=$stackPRI){//从数栈依次出栈两个数$num1=$numsStack->pop();$num2=$numsStack->pop();//再从符号栈取出一个运算符$oper=$operStack->pop();//这里还需要一个计算的函数$res=$operStack->getResult($num1,$num2,$oper);//把$res入数栈$numsStack->push($res);//把当前这个符号再入符号栈 ?????这里是有问题的,一会儿再来解决$operStack->push($ch);  }else{                  $operStack->push($ch);                   }       */while(!$operStack->isEmpty()&&$operStack->PRI($ch)<=$operStack->PRI($operStack->getTop())){//从数栈依次出栈两个数$num1=$numsStack->pop();$num2=$numsStack->pop();//再从符号栈取出一个运算符$oper=$operStack->pop();//这里还需要一个计算的函数$res=$operStack->getResult($num1,$num2,$oper);//把$res入数栈$numsStack->push($res);//把当前这个符号再入符号栈 ?????这里是有问题的,一会儿再来解决}          $operStack->push($ch);   }}else{//是数字$keepNum.=$ch;//先判断是否已经到了字符串的最后,如果已经到最后了,就直接入栈//判断一下$ch字符的下一个字符是数字还是符号if($index==strlen($exp)-1){$numsStack->push($keepNum);}else{if($operStack->isOper(substr($exp,$index+1,1))){$numsStack->push($keepNum);$keepNum='';                 }}}$index++;//让index指向下一个字符//判断是否已经扫描完毕if($index==strlen($exp)){        break;}//当扫描完毕后就break;}//只要符号栈不空就一直计算while(!$operStack->isEmpty()){$num1=$numsStack->pop();$num2=$numsStack->pop();$oper=$operStack->pop();$res=$operStack->getResult($num1,$num2,$oper);$numsStack->push($res);} //当退出while后,一定有一个数,这个数就是最终结果echo $exp.'='.$numsStack->getTop(); //自定义的栈 class MyStack{private $top=-1;//默认是-1,表示该栈是空的private $maxSize=5;//$maxSize表示栈的最大容量private $stack=array();//计算的函数public function getResult($num1,$num2,$oper){$res=0;switch($oper){case '+':$res=$num1+$num2;break;case '-':$res=$num2-$num1;break;case '*':$res=$num1*$num2;break;case '/':$res=$num2/$num1;break;            }return $res;}//返回栈顶的字符,只是取出不出栈public function getTop(){return $this->stack[$this->top];}//判断优先级的函数public function PRI($ch){if($ch=='*'||$ch=='/'){return 1;}else if($ch=='+'||$ch=='-'){return 0;}}//判断栈是否为空public function isEmpty(){if($this->top==-1){return TRUE;}else{             return FALSE;}          }//增加一个函数【提示:在我们开发中,根据需要可以灵活增加需要的函数】//判断是不是一个运算符public function isOper($ch){if($ch=='-'||$ch=='+'||$ch=='*'||$ch=='/'){return TRUE;}else{return FALSE;}}//注意类里面的变量一定要用$this->xxx,不然就杯具了//入栈的操作public function push($val){//先判断栈是否已经满了if($this->top==$this->maxSize-1){                echo '<br/>栈满,不能添加';return;}$this->top++;$this->stack[$this->top]=$val;      }//显示栈的所有数据的方法public function showStack(){if($this->top==-1){echo '<br/>栈空';return;}echo '<br/>当前栈的情况是......';for($i=$this->top;$i>-1;$i--){echo '<br/>stack['.$i.']='.$this->stack[$i];  }}//出栈的操作,就是把栈顶取出public function pop(){//判断是否是栈空if($this->top==-1){echo '<br/>栈空';return;              }//把栈顶的值,取出$topVal=$this->stack[$this->top];$this->top--;return $topVal;}}         ?>
</html>

【栈】实现高级计算器相关推荐

  1. 栈实现高级计算器的思路分享

    2019独角兽企业重金招聘Python工程师标准>>> 1.建立两个栈:valueStack(数值栈).operStack(运算符栈) 2.程序扫描表达式,当发现当前的这个字符是数字 ...

  2. PHP高级计算器的过程,PHP使用栈完成高级计算器-接上文模拟栈

    距离上一篇文章PHP模拟栈,小梦就答应了小伙伴们要使用栈来完成一个实战的例子,今天就给大家带来了这个例子,让大家更加深入理解它的使用场景! 当出现'3+4*3-2'这个字符串的时候,我们头脑中会有很多 ...

  3. java高级计算器_高级计算器[Java版]

    import java.util.Scanner; /* * time:       2012年11月17日 11:34:10 * content:     高级计算器 * author:    覃唐 ...

  4. PHP高级计算器的过程,PHP基于堆栈实现的高级计算器功能示例

    PHP基于堆栈实现的高级计算器功能示例 发布于 2017-10-14 13:38:26 | 108 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext ...

  5. php利用堆栈 实现高级计算器

    当我们得到一个字符串运算式该如何去得出它的运算结果呢? 这时候我们就能使用堆栈的算法很巧妙的解决这个问题. 思路是这样的:(我们利用php函数substr循环去截取这个字符串运算式,依次取出这个字符串 ...

  6. 七、使用栈实现综合计算器(中缀表达式)

    使用栈实现综合计算器(中缀表达式) 1.栈的实际需求 请输入一个表达式,计算式:[722-5+1-5+3-3] ,计算出结果 计算机底层是如何运算得到结果的? 注意不是简单的把算式列出运算,因为我们看 ...

  7. 数据结构:栈实现简易计算器

    文章目录 栈实现简易计算器 思路 代码实现 栈结构 运算方法 测试 栈实现简易计算器 之前的博客已经介绍了栈数据结构,栈有着数据先进后出的特点,因此用于实现简易计算器时相当方便.本博文中将介绍如何用栈 ...

  8. 【Java数据结构与算法】第四章 栈实现综合计算器

    第四章 栈实现综合计算器 文章目录 第四章 栈实现综合计算器 一.栈 1.介绍 2.应用场景 3.思路 4.代码实现 二.综合计算器 v1.0 1.思路 2.代码实现 三.前缀.中缀和后缀表达式规则 ...

  9. 【基本办公软件】万彩办公大师教程丨高级计算器的应用

    横屏显示高级计算器,含加减乘除.百分比.数值记忆储存.清除等标准计算,支持三角函数,反三角函数,指数,对数函数,幂函数,求余函数,阶乘等科学计算,实现逻辑移位指令.逻辑运算.十六进制.十进制.二进制快 ...

  10. 【数据结构与算法 6】栈实现综合计算器

    一.栈 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放 ...

最新文章

  1. ViewModelBase ObservableObject
  2. 感受学生考勤“智慧化”变革 签到荚让校园更智慧
  3. Vue绑定数据v-bind缩写:字段名 双向绑定v-model缩写:model 监听动作v-on缩写@ 记住:与数据相关用冒号 与动作相关用@
  4. Jquery函数大全 - 案例说明
  5. springboot使用ImportBeanDefinitionRegistrar 动态注册bean
  6. vue 获取数组索引_vue 重塑数组之修改数组指定index的值操作
  7. 市场的争夺-联通丢了校园投资、当当网主动发掘客户
  8. angular input_可视化的 Angular 响应式编程
  9. android listview 数据混乱,求解,listView里面嵌套listView数据显示混乱
  10. 如何在word2016中使用自带的公式编辑器
  11. jedis的hscan方法使用方法
  12. RiceQuant开源项目Rqalpha运行结果文件result.pkl读取
  13. 微型夹爪行业调研报告 - 市场现状分析与发展前景预测
  14. 基于JTT808协议的车联网网关中间件
  15. 心电电路算法滤波_心电信号噪声的数字滤波研究
  16. java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100/虚拟机调优
  17. 年薪50万?智能仓储物流的从业者的薪酬水平| 你拖后腿了吗?(文尾索取报告)...
  18. 单片机 c语言 d,单片机89C51与A/D转换器MAX - 控制/MCU - 电子发烧友网
  19. DC-DC电路中通过串联电阻来增加陶瓷电容的ESR从而替代钽电容。
  20. 36.(cesium篇)cesium站立的圆面

热门文章

  1. python win32com批量导出.ppt/.pptx文件所有图片
  2. 深入理解GO语言:map结构原理和源码分析
  3. 链表--逆时针旋转一个链表
  4. macOS无法验证此App不包含恶意软件
  5. 在 HBuilder X 创建Uni-app项目运行时报错
  6. 【实验报告】微处理器原理与应用 CPUHomework1.2 上篇【掌握DEBUG基本命令及其功能 查看CPU和内存 用机器指令和汇编指令编程】
  7. shell判断大于、小于、等于
  8. 数据库语法整理及WAF绕过方式
  9. 天才基本法--裴之的“自动战棋“代码
  10. 二---------