PHP 算法之 -- 计算器设计
<?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];
}
}
}
?>
PHP 算法之 -- 计算器设计的更多相关文章
- Java实现 蓝桥杯VIP 算法提高 计算器
算法提高 计算器 时间限制:1.0s 内存限制:256.0MB [问题描述] 王小二的计算器上面的LED显示屏坏掉了,于是他找到了在计算器维修与应用系学习的你来为他修计算器. 屏幕上可以显示0~9的数 ...
- 结对实验报告-android计算器设计
一:引言 目前手机可以说是普及率非常高的电子设备了,由于其便于携带,使用方便,资费适中等等原因,现在手机已经在一定程度开始代替固定电话的通话功能,以及一些原来电脑软件上的功能了.手机上的软件也随着 ...
- 单片机课程设计-四位加法计算器设计参考程序(c语言)
#include<reg52.h> typedef unsigned char uint8; typedef unsigned int uint16; sbit rw=P2^; sbit ...
- C#之简易计算器设计
在学完了C#的方法和数据类型之后,写了一个简易的计算器的界面.本次界面具备加减乘除求余等五项运算.不过存在一点缺陷就是无法判断输入数据的类型,是整数还是小数,由于目前所学知识有限,等学到以后再进行完善 ...
- JAVA 图形开发之计算器设计(事件监听机制)
/*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 1978702969@qq.com*/ 前段时间刚帮同学用MFC写了个计算器,现在学到JAVA的图形开发,就试着水了一个计算器出来.(可以说 ...
- 20204107 孙嘉临《PYTHON程序设计》计算器设计实验二报告
课程:<python程序设计> 班级:2041 姓名:孙嘉临 学号:20204107 实验教师:王志强 实验日期:2021年4月12日 必修/选修:公选课 ##一.实验内容 设计并完成一个 ...
- “程序设计与算法训练”课程设计:“BP神经网络的实现”(C++类封装实现)
一 题目: 71 BP神经网络的实现: 利用C++语言实现BP神经网络, 并利用BP神经网络解决螨虫分类问题: 蠓虫分类问题:对两种蠓虫(A与B)进行鉴别,依据的资料是触角和翅膀的长度,已知了9支Af ...
- C++ | 栈的应用(逆波兰算法) | 计算器
#include <iostream> using std::cin; using std::cout; using std::endl; template<typename T&g ...
- 简单计算器设计(WPF)
要求: 文本框居中,用户不能修改运算结果 当用户选择不同的运算类型时 下方GroupBox的标题与所选运算类型相对应 且文本框数字立即清空 单击[计算]按钮时 如果文本框输入的内容非法 结果文本框显示 ...
随机推荐
- SQL 练习4
查询不存在" 01 "课程但存在" 02 "课程的情况 SELECT * from sc WHERE cid = '02' AND sid not in (SE ...
- 黑马JVM教程——自学笔记(一)
一.引言 1.1.什么是JVM 定义: Java Virtual Machine - java的运行环境(java二进制字节码的运行环境) 好处: 一次编写,导出运行 自动内存管理,垃圾回收功能 数组 ...
- Java使用Lettuce操作redis
maven包 # 包含了lettuce jar <dependency> <groupId>org.springframework.boot</groupId> & ...
- 使用git下载码云仓库文件步骤总结
从码云下载文件的两种方式(私服时) 1.让私服管理者复制链接,然后你加入私服: 2.生成公钥,让私服管理者添加你的公钥. 在eclipse中找到git,输入自己的登录账号和密码,下载文件到本地仓库,然 ...
- Qt MDI及其使用方法(详解版)
统的应用程序设计中有多文档界面(Multi-document Interface,MDI)应用程序,Qt 为设计 MDI 应用程序提供了支持. 本节的实例 samp6_4 是一个 MDI 应用程序,程 ...
- Math.round() 函数返回一个数字四舍五入后最接近的整数。
语法: Math.round(x); 参数:x 返回值:给定数字的值四舍五入到最接近的整数 描述: 如果参数的小数部分大于 0.5,则舍入到相邻的绝对值更大的整数. 如果参数的小数部分小于 0.5,则 ...
- Spring 钩子之BeanFactoryPostProcessor和BeanPostProcessor的源码学习,FactoryBean
BeanFactoryPostProcessor 是用于增强BeanFactory的(例如可以增强beanDefination), BeanPostProcessor是用于增强bean的,而Facto ...
- Spring第一课:核心API(三)
以上是Spring的核心部分,其中需要了解的是:BeanFactory.ApplicationContext[FileSystemXmlApplicationContext.ClassPathXmlA ...
- 移动端动画——requestAnimationFrame
window.requestAnimationFrame() 告诉浏览器--你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画.该方法需要传入一个回调函数作为参数,该回调函数会 ...
- 从零开始实现简单 RPC 框架 6:网络通信之 Netty
网络通信的开发,就涉及到一些开发框架:Java NIO.Netty.Mina 等等. 理论上来说,类似于序列化器,可以为其定义一套统一的接口,让不同类型的框架实现,事实上,Dubbo 就是这么干的. ...