`
webcode
  • 浏览: 5947808 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

清华大学韩顺平讲师讲算法之三(上),高性能计算器堆之应用

 
阅读更多
<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>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics