`
ling凌yue月
  • 浏览: 339251 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

表达式求值

 
阅读更多

 

 

//后缀表达式求值
function calculate($equation = ''){
    if(empty($equation)){
        return 0;
    }
    //声明各个符号的算法函数
    $operations = array('+' => function($param1, $param2){
        return $param1 + $param2;
    }, '-' => function($param1, $param2){
        return $param1 - $param2;
    }, '*' => function($param1, $param2){
        return $param1 * $param2;
    }, '/' => function($param1, $param2){
        return $param1 / $param2;
    });
    //将表达式用空格分隔为数组
    $equationArr = explode(' ', $equation);
    $numStack = array();
    $result = 0;
    //循环数组
    foreach($equationArr as $c){
        //如果是符号
        if(in_array($c, array_keys($operations))){
            $param1 = (int)array_pop($numStack);
            $param2 = (int)array_pop($numStack);
            $subEquation = $operations[$c]($param2, $param1);
            array_push($numStack, $subEquation);
        //如果是数字,将本数入栈
        }else{
            array_push($numStack, intval($c));
        }
    }
    return array_pop($numStack);
}

$result = calculate('2 3 5 7 + - *');
var_dump($result);

 

 

//( ( 1 + 2 ) * 3 ) * 3 + 4 / 2
//转换中缀表达式为后缀表达式
function infixToPosfixNotation($equation = ''){
    if(empty($equation)){
		return false;
	}
    $operations = array('+' => array('p' => 1), '-' => array('p' => 1), '*' => array('p' => 3)
    , '/' => array('p' => 2),'(' => array('p' =>0), ')' => array('p' => 0),
    );
    $numStack = array();
    $operStack = array();
    $equationArr = explode(' ', $equation);
    foreach($equationArr as $c){
        //将优先级高的操作符放到操作符栈顶
        if(in_array($c, array_keys($operations))){
			//如果操作符栈为空
            switch($c){
            case '(':
                array_push($operStack, $c);
                break;
            case ')':
				//如果是右括号
                while(($popOper = end($operStack)) && $popOper != '('){
                    array_push($numStack, array_pop($operStack));
                }
                //去除左括号
                array_pop($operStack);
                break;
            default:
                $popOper = end($operStack);
                while(($popOper = end($operStack)) && $popOper != '(' && $operations[$popOper]['p'] > $operations[$c]['p']){
                    array_push($numStack, array_pop($operStack));
                }//压入符号栈
                array_push($operStack, $c);
                break;
            }         	   
    	}else{
            array_push($numStack, intval($c));
		}
	}
    while($popOper = array_pop($operStack)){
        array_push($numStack, $popOper);
    }
    return implode(' ', $numStack);
}

 

 

 

 

分享到:
评论

相关推荐

    表达式求值代码

    在编程领域,表达式求值是计算数学或逻辑表达式以获取结果的过程。在这个场景中,我们关注的是如何使用栈数据结构来实现这个功能。栈是一种后进先出(LIFO)的数据结构,非常适合处理括号匹配和运算符优先级问题,这...

    C# 表达式求值,字符串表达式求值

    字符串表达式求值 输入类似1+2+3,6*5/7的字符串,计算出值

    表达式求值 算法 代码 报告 流程图

    在计算机科学中,表达式求值是编程语言理论的一个核心概念,主要涉及如何解析和计算数学或逻辑表达式。这个过程通常分为两个阶段:语法分析(解析)和语义分析(求值)。以下是对表达式求值算法、代码实现、报告编写...

    表达式求值C语言实现

    在IT领域,表达式求值是一项基础且重要的任务,它涉及到计算机如何解析和计算数学或逻辑表达式。本文将深入探讨一个用C语言实现的表达式求值程序,该程序特别强调了对浮点数(float型)和乘方运算的支持。 首先,...

    表达式求值C++代码(含实验报告)

    在本项目中,我们主要关注的是使用C++编程语言实现表达式求值的功能。这是一个典型的数据结构与算法问题,尤其适用于计算机科学与信息技术专业的学生进行实践学习。C++是一种强大的编程语言,它提供了丰富的特性来...

    表达式求值,用二叉树

    ### 表达式求值与二叉树的关系 在计算机科学中,利用二叉树来表示和求解表达式是一种常见的方法。这种方法的核心是通过构建一个以运算符为节点、以操作数为叶子节点的二叉树结构,来实现表达式的解析和计算。 ####...

    表达式求值的实验报告

    这篇实验报告主要探讨了如何利用栈来实现算术表达式的求值,这对于初学者理解程序设计语言中的表达式计算机制非常有帮助。报告中提到,表达式计算是程序设计语言的基础,而这个问题可以通过将数学表达式转化为后缀...

    C++ 表达式求值(采用类模板写的)

    在C++编程中,表达式求值是一个常见的需求,特别是在解析和执行数学或逻辑表达式时。本项目采用类模板技术实现了一个表达式求值器,这是一个强大的工具,可以帮助我们处理复杂的计算任务。下面我们将详细探讨这个...

    后缀表达式求值(c语言版)

    根据给定的文件信息,我们可以总结出以下关于“后缀表达式求值”的详细知识点,主要涉及C语言在数据结构中的应用,特别是栈的应用来解析和计算后缀表达式。 ### 1. 后缀表达式的概念 后缀表达式,也称为逆波兰表示...

    Siliphen的表达式求值实践工程代码

    《Siliphen的表达式求值实践工程代码》是一个关于计算机科学中表达式求值的实践项目,这个项目深入探讨了如何在编程中实现表达式的计算。表达式求值是计算机科学的基础,尤其是在编译原理、解释器设计以及计算理论等...

    数据结构-表达式求值实验报告.doc

    表达式求值实验报告 数据结构是计算机科学中的一门重要课程,涉及到算法、数据存储、表达式求值等多个方面。在本次实验报告中,我们将着重于表达式求值的实现,包括数据结构设计、算法设计、ADT 描述等方面。 1. ...

    Java表达式求值2.0

    在Java编程语言中,表达式求值是一项基本且重要的任务,尤其在动态计算、脚本解析或编译器实现等领域。"Java表达式求值2.0"可能是指一个优化过的版本,用于更高效地处理Java中的数学或逻辑表达式。这个版本可能是...

    数据结构 表达式求值

    ### 数据结构与表达式求值知识点解析 #### 一、问题背景及定义 在计算机科学领域,**表达式求值**是一项基础而重要的任务。它涉及到如何解析并计算由数字和运算符组成的数学表达式的值。例如,对于表达式 `3 * (9 ...

    数据结构课程设计算数表达式求值

    数据结构课程设计算数表达式求值 在数据结构课程设计中,算数表达式求值是一个非常重要的主题。本文将详细介绍算数表达式求值的实现过程,包括课程设计的介绍、课程设计的原理、数据结构分析、调试与分析等方面。 ...

    表达式求值程序

    《表达式求值程序——深入理解.NET MFC与VC++实现》 在计算机科学中,表达式求值是计算编程语言中的一个基本概念,它涉及将符号表达式转化为实际值的过程。本文将深入探讨如何使用.NET框架、MFC(Microsoft ...

    表达式求值【完整版】

    【表达式求值】是计算机科学中的一个重要概念,特别是在编译原理和数据结构课程中。这个过程涉及到将一个数学表达式转换成等价的计算形式,以便计算机可以准确地求解其值。以下是对该主题的详细说明: 一、算术...

    用栈解决表达式求值问题(数据结构)

    ### 用栈解决表达式求值问题(数据结构) #### 表达式求值与栈的应用 在计算机科学中,表达式的求值是一项常见的任务,尤其是在解析数学公式、执行编程语言中的运算等方面。通常,这类任务涉及到将一个复杂的数学...

    数据结构——表达式求值 完整代码

    在这个话题中,我们关注的是“表达式求值”,一个常见的数据结构应用,特别是中缀表达式到后缀表达式的转换以及其求值过程。中缀表达式是我们日常使用的数学表达式形式,如2 + 3 * 4,而后缀表达式,也称为逆波兰...

    栈实现表达式求值

    栈实现表达式求值

    《数据结构_课程设计》表达式求值_实验报告

    《数据结构_课程设计》表达式求值_实验报告详细解析 本次实验是关于数据结构课程设计的一个项目,主要目标是实现一个算术表达式的求值程序,利用栈这一数据结构来处理运算符的优先级,从而计算出表达式的正确结果。...

Global site tag (gtag.js) - Google Analytics