<html>
<head>
<meta http-equiv='content-type' content='text/html;charset=utf-8'>
<title>/高性能的计算器的结果/</title>
</head>
<body>
<?php
//$exp=$_GET['exp'];
$exp='3+2*6-2';
/*人的眼睛就一条狗
老师的思路:
1.程序扫描表达式;
2。当发现字符是数字则放在数栈里;
3。或是运算符,则分以下情况;
3。1若符号栈为空则直接入符号栈,
3。2如果当前运算符的优先级小于等于版本号栈顶的的运算符的优先级,就开始计算;并便计算结果入数栈;/要补充一下,然后把当前符号入栈改成一直到当前符号的运算级加小于符号栈/
3。3若符号栈不为空,如果当前运算符的优先级大于版本号栈顶的的运算符的优先级,就入栈;
4。当扫描完毕后,把所有的数弹出,开始计算,最后在数栈里的便是结果。
思想要变成代码
*/
//定义一个数据
$numsStack=new MyStack();
$operStack=new MyStack();
$index=0;//是一个扫描标记
$keepNum='';//用于拼接数字用的
while(true){
//依次取出字符
$ch=substr($exp,$index,1);
if($operStack->isOper($ch) == true){
if($operStack->isEmpty()){
$operStack->push($ch);
}else{//一个函数,运算符的优化级,*/为1;+-为0
$operStack->PRI($ch);
$stackPRI=$operStack->PRI($operStack->getTop());
if($chPRI<=$stackPRI){
//2个数栈的数
$num1=$numsStack->pop();
$num2=$numsStack->pop();
//再从符号栈取一个符号
$oper=$operStack->pop();
$res=$operStack->getResult($num1,$num2,$oper);
$numsStack->push($res);//把结果入数栈
$operStack->push($ch);//再把符号栈入符栈
}
}
}else{
$keepNum.=$ch;
//要看一下$ch的下一个是不是数字才能入栈,否则是30+90出错
//若到了最后就不用入栈
if($index==strlen($exp)-1){
$numsStack->push($keepNum);
}else{
if($operStack->isOper(substr($exp,$index+1,1))){
$numsStack->push($keepNum);
$keepNum.=$ch;
}else{
//下一个是数,不做处理
}
}
}
$index++;//让$index指向下一个字符
//当扫描完毕后,就break
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时,数栈里有一个数,便是结果;
//建一个栈
栈里增加一个函数
public function isOper($ch){
if($ch=='-' || $ch=='+' || $ch=='*' || $ch=='/'){
return true;
}else{
return false;
}
}//isOper
public function isEmpty(){//是不是空栈
if($this->top==-1){
return true;
}else{
return false;
}
}//isEmpty
public function PRI($ch){
if($ch =='*' || $ch=='/'){
return 1;
}else if($ch == '+' || $ch=='1'){
return 0;
}
}//PRI
public function getTop(){//返回栈顶元素
return $this->thisTop();
}
public function getResult($num1,$num2,$oper){
$res=0;
switch ($oper) {
case '+':
$res=$num1+$num2;
break;
case '-':
$res=$num2-$num1;//顺序
break;
case '*':
$res=$num2*$num1;
break;
case '/':
$res=$num2/$num1;//顺序
break;
default:
# code...
break;
}
}
?>
</body>
分享到:
相关推荐
韩顺平计算器
分两种方法 一种是两个jsp实现一个计算器,另一种是在同一jsp中实现 并实现了验证
韩顺平计算器的源代码 基本上是最新版的 是jsp2那个版本的 不坑你 myCalInterface.jsp result.jsp 还有二者和在一起的页面 你懂得 绝对可以运行
这是我从B站上看韩老师讲的数据结构与算法后整理的笔记 代码经过运行,欢迎批评指正 有些地方我感觉还是挺难的 大都经过我自己的语言进行描述,韩老师中期的表达可能或多或少也影响可阅读性,望先生们见谅
韩顺平轻松搞定HTML+css+js中HTML部分经常使用的帮助文档,清华大学出品!好东西!!
数据结构和算法中韩顺平老师讲的是最好的值得大家学习交流 大数据技术之Scala数据结构和算法
清华大学图书馆主页 html语言教程(html版) 韩顺平老师视频教程同款
韩顺平jsp视频教程中jsp实现计算器源码,分别使用两个和一个jsp页面实现计算器功能,并实现验证 两个jsp实现计算器,mycalinterface.jsp(界面) result.jsp(计算) 一个jsp实现计算器,all_cal.jsp(计算和显示...
韩顺平jsp九讲笔记
韩顺平PHP149讲完整笔记之整理版本http协议部分
韩顺平 玩转oralce第3讲 oracle的基本使用 韩顺平 玩转oralce第3讲 oracle的基本使用
韩顺平PHP149讲笔记之基本语法2完整版本随堂版本
韩顺平jsp视频教程中jsp实现计算器源码,分别使用两个和一个jsp页面实现计算器功能,并实现验证 两个jsp实现计算器,mycalinterface.jsp(界面) result.jsp(计算) 一个jsp实现计算器,all_cal.jsp(计算和显示...
韩顺平讲linux笔记
韩顺平servlet 第4、5讲 事例代码韩顺平servlet 第4、5讲 事例代码韩顺平servlet 第4、5讲 事例代码
韩顺平PHP149讲之htm完整笔记之html部分
韩顺平servlet的计算器项目,是我手敲的,和大家分享一下
韩顺平讲的SQL作业评价答案,我看视频一句一句敲的,上面有我自己的点评