登录  /  注册
首页 > php教程 > php手册 > 正文

php四则运算:中缀表达式转后缀表达式例子

php中文网
发布: 2016-05-23 13:07:31
原创
1964人浏览过

很多人对于四则运算可能不太明天了,下面我们来看看关于php四则运算,中缀表达式转后缀表达式例子,有需要了解的朋友可以一起来看看吧.

四则运算表达式,我们书面使用的叫做中缀表达式,而计算器,却更加喜欢后缀表达,括号优先级,加减乘除优先级等使得运算中缀四则表达式变得困难,这个时候引入了一种计算机喜欢的格式,叫做后缀表达式,本文以PHP代码,实现中缀表达式转后缀表达式的逻辑.

本文以PHP为代码环境,有人会说高级语言直接写表达式就好了,它们会算,可是他们为什么会算,怎么算的,还是需要把中缀表达式转为后缀表达式,因此本文代码只是模拟一个逻辑.

比如:传统的四则运算表达式(中缀表达式)是9 + ( 3 - 1 ) * 3 + 10 / 2,对应的后缀表达式就是9 3 1 - 3 * + 10 2 / +。

转换逻辑:一个字符一个字符的输入,如果是数字则直接输出,如果是左括号则直接入栈,如果是右括号则开始出栈,直到遇到第一次左括号为止,如果是加减乘除,则判断,如果栈顶也是符号,且输入的符号的优先级不高于栈顶的符号优先级,则全部出栈,否则该输入的符号入栈.

<?php 
	/** 
	 * 将输入的字符按照中缀表达式转后缀表达式的规则处理 
	 * @param $str 输入的字符 
	 * @param $stack 栈 
	 * @param $newStrList 新的表达式 
	 */ 
	function suffix($str, &$stack, &$newStrList){ 
	    //如果是数字则输出 
	    if(is_numeric($str)){ 
	        $newStrList .= $str . &#39; &#39;; 
	    } 
	    //如果是左括号则入栈 
	    else if($str == &#39;(&#39;){ 
	        $stack[] = $str; 
	    } 
	    //如果是右括号则将最近的左括号之前的所有数据出栈 
	    else if($str == &#39;)&#39;){ 
	        while($arrPop = array_pop($stack)){ 
	            if($arrPop == &#39;(&#39;){ 
	                break; 
	            } 
	            $newStrList .= $arrPop . &#39; &#39;; 
	        }  
	    } 
	    //如果是加减乘除则判断与栈顶符号优先级 
	    else if(in_array($str, array(&#39;+&#39;, &#39;-&#39;, &#39;*&#39;, &#39;/&#39;)) && count($stack) > 0){ 
	        $key  = (count($stack) - 1); 
	        if(in_array($stack[$key], array(&#39;+&#39;, &#39;-&#39;, &#39;*&#39;, &#39;/&#39;))){ 
	            //该符号优先级不高于栈顶符号的 
	            if(checkPriority($str, $stack[$key]) != 1){ 
	                for($i=$key; $i>=0; $i--){ 
	                    if($stack[$i] == &#39;(&#39;){ 
	                        break; 
	                    } 
	                    $newStrList .= $stack[$i] . &#39; &#39;; 
	                    unset($stack[$i]); 
	                    $stack = array_values($stack); 
	                } 
	            } 
	        } 
	        //本次的符号入栈 
	        $stack[] = $str; 
	    }else{ 
	        $stack[] = $str; 
	    } 
	} 
	 
	/** 
	 * 判断运算符的优先级 
	 * @param $operatorA 
	 * @param $operatorB 
	 * @return A大于B返回1,A等于B返回0,A小于B返回-1 
	 */ 
	function checkPriority($operatorA, $operatorB){ 
	    switch($operatorA){ 
	        case &#39;+&#39;: 
	        case &#39;-&#39;: 
	            if($operatorB == &#39;+&#39; || $operatorB == &#39;-&#39;){ 
	                return 0; 
	            }else if($operatorB == &#39;*&#39; || $operatorB == &#39;/&#39;){ 
	                return -1; 
	            } 
	            break; 
	        case &#39;*&#39;: 
	        case &#39;/&#39;: 
	            if($operatorB == &#39;+&#39; || $operatorB == &#39;-&#39;){ 
	                return 1; 
	            }else if($operatorB == &#39;*&#39; || $operatorB == &#39;/&#39;){ 
	                return 0; 
	            } 
	            break; 
	        default: 
	            exit(&#39;error&#39;); 
	    } 
	} 
	//栈 
	$stack = array(); 
	//待转换的表达式 
	$strList = &#39;9 + ( 3 - 1 ) * 3 + 10 / 2&#39;; 
	//新的表达式 
	$newStrList = &#39;&#39;; 
	$strList = explode(&#39; &#39;, $strList); 
	foreach($strList as $str){ 
	    if($str != &#39; &#39;){ 
	        suffix($str, $stack, $newStrList); 
	    } 
	} 
	//数组反转 
	while($s = array_pop($stack)){ 
	    $newStrList .= $s . &#39; &#39;; 
	} 
	echo $newStrList; 
	
登录后复制


永久地址:

转载随意~请带上教程地址吧^^

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号