• 波兰表示法


    http://blog.csdn.net/pipisorry/article/details/37818013

    波兰表示法Polish notation。或波兰记法),是一种逻辑算术代数表示方法。其特点是操作符置于操作数的前面。因此也称做前缀表示法。假设操作符的元数(arity)是固定的,则语法上不须要括号仍然能被无歧义地解析。波兰记法是波兰数学家扬·武卡谢维奇1920年代引入的。用于简化命题逻辑

    阿隆佐·邱奇在他的经典著作《数理逻辑》中提出该表达方法是一种值得被关注的记法系统,甚至将它与阿弗烈·諾夫·懷海德伯特兰·罗素在《数学原理》中的逻辑表达式相提并论。

    [2]

    波兰表示法尽管在逻辑领域没有被广泛使用,但仍在计算机科学领域占有一席之地。

    算术形式

    表达“三加四”时,前缀记法写作“+ 3 4”,而不是“3 + 4”。在复杂的表达式中,操作符仍然在操作数的前面,但操作数可能是包括操作符的平庸表达式。

    比如,例如以下的中缀表达式:

    (5 − 6) * 7

    写作前缀表示法时是:

    *(− 5 6) 7

    或省略括号:

    * − 5 6 7

    因为简单的算术运算符都是二元的。该前缀表达式无需括号,且表述是无歧义的。在前面的样例里。中缀形式的括号是必需的,假设将括号移动到:

    5 − (6 * 7)

    即:

    5 − 6 * 7

    则会改变整个表达式的值。

    而其正确的前缀形式是:

    − 5 * 6 7

    减法运算要等它的两个操作数(5;6和7的乘积)都完毕时才会处理。在不论什么表示法中。最里面的表达式最先运算。而在波兰表达式中。决定“最里面”的是顺序而不是括号。

    简单算术的前缀表达式主要是用于学术研究方面。与逆波兰表示法不同,前缀表达式基本没有在商业计算器中使用过,可是其体系常常在编译器构造的概念教学中首先使用。

    计算机编程

    LISPS-表达式中广泛地使用了前缀记法,S-表达式中使用了括号是由于它的算术操作符有可变的元数(arity)。逆波兰表示法在很多基于堆栈程序语言(如PostScript)中使用。以及是一些计算器(特别是惠普)的运算原理。

    假定仅仅有二元运算时。操作数的个数必定为操作符的个数加一。否则表达式就无意义。这样在计算更复杂,更长的表达式时。能够简单地忽略某些错误表达式,因此在使用前缀记法时必须小心细致检查其表达意义。

    运算顺序

    前缀表达式的运算顺序非常easy检測。需注意的是。当运算时,操作符是作用在第一个操作数上。特别是需注意不满足交换律的运算。如除法减法

    比如,下列式子:

     / 10 5 = 2  (前缀记法)
    

    表示10/5。结果是2,而不是½。

    基于堆栈的操作符由于其本身的特性,无需括号也非常easy区分运算的顺序。因此大量使用波兰记法。

    运算波兰表达式时。无需记住运算的层次,仅仅须要直接寻找第一个运算的操作符。以二元运算为例,从左至右读入表达式,遇到一个操作符后尾随两个操作数时。则计算之,然后将结果作为操作数替换这个操作符和两个操作数;反复此步骤,直至全部操作符处理完毕。由于在正确的前缀表达式中。操作数必定比操作符多一个。所以必定能找到一个操作符符合运算条件。而替换时,两个操作数和一个操作符替换为一个操作数。所以降低了各一个操作符和操作数,仍然能够迭代运算直至计算整个式子。

    多元运算也类似,遇到足够的操作数即产生运算。迭代直至完毕。迭代结束的条件由表达式的正确性来保证。以下是一个样例。演示了每一步的运算顺序:

     - * / 15 - 7 + 1 1 3 + 2 + 1 1 =
     - * / 15 - 7   2   3 + 2 + 1 1 =
     - * / 15     5     3 + 2 + 1 1 =
     - *        3       3 + 2 + 1 1 =
     -          9         + 2 + 1 1 =
     -          9         + 2   2   =
     -          9         4         =
                    5

    /*求解波兰表达式的值*/
    输入数据:
    输入为一行,当中运算符和运算数之间都用空格分隔,运算数是浮点数
    输出要求:
    输出为一行,表达式的值。
    * + 11.0 12.0 + 24.0 35.0

    编程实现:

    /****************************************************************************/
    /*	 	POJ读书笔记9.4 —— 波兰表达式2694	皮皮 2014-7-10	*/
    /****************************************************************************/
    #include <stdio.h>
    #include <stdlib.h>
    
    /*	波兰表达式递归算法	*/
    double PolNote(){
    	char input[10];
    	scanf("%s", input);
    	switch(input[0]){					//输入字符串字符是否是运算符
    	case '+':
    		return PolNote() + PolNote();
    	case '-':
    		return PolNote() - PolNote();
    	case '*':
    		return PolNote() * PolNote();
    	case '/':
    		return PolNote() / PolNote();
    	default:
    		return atof(input);				//输入字符串数字转换为double
    	}
    }
    
    int main(){
    	printf("%f", PolNote());
    	return 0;
    }
    

    from:http://blog.csdn.net/pipisorry/article/details/37818013

    ref:http://zh.wikipedia.org/zh/%E6%B3%A2%E5%85%B0%E8%A1%A8%E7%A4%BA%E6%B3%95


  • 相关阅读:
    net core 在开发环境IIS程序物理路径指向代码文件
    asp.net core 源码下载以及build
    Autofac学习之三种生命周期:InstancePerLifetimeScope、SingleInstance、InstancePerDependency
    ASP.NET Core 使用 AutoFac 注入 DbContext
    ASP.net core 中控制器直接访问wwwroot的静态文件
    在ASP.NET Core中处置IDisposable的四种方法
    sql语句优化之SQL Server(详细整理)
    sql语句的优化分析
    sql server中如何查看执行效率不高的语句
    [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6830663.html
Copyright © 2020-2023  润新知