<?php//$exp='300+20*6-20'; $exp='71*2-50*3-3-67*6+80'; //14-15-3=-4//定义一个数栈和一个符号栈$numsStack=new MyStack();$operStack=new MyStack();$keepNum='';//专门用于拼接多位数的字符串$index=0;//$index就是一个扫描的标记while(true){//依次取出字符$ch=substr($exp,$index,1);//判断$ch是不是一个运算符号.if($operStack->isOper($ch)==true){//是运算符/**3.如果发现是运算符3.1 如果符号栈为空,就直接入符号栈3.2. 如何符号栈,不为空,就判断如果当前运算符的优先级小于等于符号栈顶的这个运算符的优先级,就计算,并把计算结果入数栈.然后把当前符号入栈3.3 如何符号栈,不为空,就判断如果当前运算符的优先级大于符号栈顶的这个运算符的优先级,就入栈.*/if($operStack->isEmpty()){$operStack->push($ch);}else{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入数栈<font size="" color=""></font>$numsStack->push($res);}//把当前这个符号再入符号栈.//???????问题,一会在解决$operStack->push($ch);            }}else{$keepNum.=$ch;                                //先判断是否已经到字符串最后.如果已经到最后,就直接入栈.if($index==strlen($exp)-1){$numsStack->push($keepNum);}else{//要判断一下$ch字符的下一个字符是数字还是符号.if($operStack->isOper(substr($exp,$index+1,1))){                        $numsStack->push($keepNum);$keepNum='';}}                   }$index++;//让$index指向下一个字符.//判断是否已经扫描完毕if($index==strlen($exp)){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;}}//入栈的操作public function  push($val){//先判断栈是否已经满了if($this->top==$this->maxSize-1){echo '<br/>栈满,不能添加';return;}$this->top++;$this->stack[$this->top]=$val;}//出栈的操作,就是把栈顶的值取出public function pop(){//判断是否栈空if($this->top==-1){echo '<br/>栈空';return;}//把栈顶的值,取出$topVal=$this->stack[$this->top];$this->top--;return $topVal;}//显示栈的所有数据的方法.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];}}}
?>

转载于:https://www.cnblogs.com/songyanan/p/10628436.html

PHP 算法之 -- 计算器设计相关推荐

  1. 基于FPGA的电子计算器设计(上)

    今天给大侠带来基于FPGA的电子计算器设计,由于篇幅较长,分三篇.今天带来第一篇,上篇,话不多说,上货. 导读 本篇介绍了一个简单计算器的设计,基于 FPGA 硬件描述语言 Verilog HDL,系 ...

  2. 计算器java程序设计报告总体设计_计算器设计的java课程设计报告.doc

    计算器设计的java课程设计报告.doc 华东交通大学课程设计1华东交通大学课程设计课程:Java程序设计题目:计算器设计年级:2010级专业:信息一班学号:姓名:组员:指导教师:课程设计题目:计算器 ...

  3. 斐波那契(Fibonacci)数列计算器设计

    资源下载地址:https://download.csdn.net/download/sheziqiong/85734538 资源下载地址:https://download.csdn.net/downl ...

  4. 基于51单片机的4乘4计算器设计

    具体实现功能 系统由STC89C52单片机+4乘4按键模块+LCD1602液晶显示屏+电源构成. 具体功能: 利用输入采用4×4矩阵键盘,可以进行加.减.乘.除等几种数字运算,并在LCD1602上显示 ...

  5. 基于stm32简易计算机电路图,基于STM32的简易电子计算器设计与实现(DOC).doc

    嵌入式系统设计实验综合设计报告 PAGE 四川师范大学成都学院通信工程学院 基于STM32的简易电子计算器设计与实现 实验综合设计报告 学生姓名 陶龑 学 号 2016301033 所在学院 通信工程 ...

  6. 基于sobel算法的边缘检测设计与实现

    基于sobel算法的边缘检测设计与实现 边缘是图像的基本特征.边缘检测针对的是灰度图像,目的是标识数字图像中灰度变化明显的点. 边缘检测的方法大致可以分为两类:基于查找的一类,通过寻找图像一阶导数中最 ...

  7. 基于51单片机的蜂鸣计算器设计

    一.课程设计内容及要求 蜂鸣计算器设计: 利用普中科技HC6800-ES V2.0单片机开发板设计一款带蜂鸣器的电子计算器.主要使用开发板上的数码管.LED点阵.矩阵键盘.蜂鸣器等模块功能.开发板配有 ...

  8. C++ Qt学习笔记 (1) 简易计算器设计

    最近开始学习c++ qt, 按照教材上的例程设计一个简易的桌面计算器: Qt是一个基于C++语言的跨平台应用程序和UI开发框架,主要包含一个类库,和跨平台开发及国际化的工具,最初由挪威的Trollte ...

  9. 全民K歌推荐系统架构、算法及后台设计实践

    猜你喜欢 0.2021年轻人性生活调研报告1.如何搭建一套个性化推荐系统?2.从零开始搭建创业公司后台技术栈3.2021年10月份热门报告免费下载4.微博推荐算法实践与机器学习平台演进5.腾讯PCG推 ...

最新文章

  1. android自学笔记《五》——模拟器的使用
  2. 【Flask项目】项目准备之-创建模块的蓝图
  3. unity安装,sdk,jdk问题
  4. android uber源码,Uber SDK in android
  5. JavaScript和jQuery的学习
  6. 10、Spring Boot 2.x 集成 Log4j2
  7. [LeetCode]50.Pow(x, n)
  8. 产业区块链一周动态丨数字货币发展写入十四五规划,湖南印发区块链发展规划...
  9. 魔兽世界单机(芒果3.3.5a)机器人操作命令大全
  10. 燃烧的远征服务器排队小程序,你还在让顾客排队吗?试试小程序吧!让顾客不再排队!...
  11. 双层动态规划_吃土豆问题
  12. 为什么要做小程序?90%的商家不知道的好处!
  13. easyui treegrid php,Easyui在treegrid添加控件实例教程
  14. 程序员转正述职报告_公司程序员试用期转正工作总结
  15. Excel进度条设置百分比解决
  16. Android获取系统邮件账号
  17. 金牛来到,福气来到——TcaplusDB新年放送
  18. Ngnix配置config
  19. 【已解决】连接被重置
  20. Matlab打开LabVIEW的tdm/tdms文件

热门文章

  1. 每天一道LeetCode-----有序数组循环右移n位后,寻找最小值,数组中可能包含重复元素
  2. 逆向与汇编的一些笔记
  3. 封装数据库一系列操作,包括打开/新建数据库,增删改查
  4. pixhawk commander.cpp的飞行模式切换解读
  5. C++知识 interview
  6. Tensorflow加载模型(进阶版):如何利用预训练模型进行微调(fintuning)
  7. allocator类初学的简单例子
  8. 字符串中最后一个单词长度
  9. 关于优酷开放SDK相应的mediaplayer的监听器的设置之setOnBufferingUpdateListener
  10. Hibernate数据保存操作方法的原理对比