c#数学表示法(后缀表示法)详解

在笔试中有这么一道题目,写出一个表达式的后缀表示形式,当时就迷茫了,什么是后缀表达式,还真没听过。后来查了下原来是一种比较特殊的数学表达式,因为在日常生活中用的不多,不太了解。有三种表达式:前缀表达式、中缀表达式和后缀表达式。一般用的是中缀,比如1+1,前后缀就是把操作符移到前面和后面,下面我就来介绍一下这三种表达式。

1.前缀表示法

前缀表示法又叫波兰表示法,他的操作符置于操作数的前面(例:+ 1 2),是波兰数学家扬·武卡谢维奇1920年代引入的,用于简化命题逻辑。因为我们一般认为操作符是在操作数中间的,所以在日常生活中用的不多,但在计算机科学领域占有一席之地。一般的表示法对计算机来说处理很麻烦,每个符号都要考虑优先级,还有括号这种会打乱优先级的存在,将使计算机花费大量的资源进行解析。而前缀表示法没有优先级的概念,他是按顺序处理的。
举个例子:9-2*3这个式子,计算机需要先分析优先级,先乘后减,找到2*3,再进行减操作;化成前缀表示法就是:- 9 * 2 3,计算机可以依次读取,操作符作用于后一个操作数,遇到减就是让9减去后面的数,而跟着9的是乘,也就是说让9减去乘的结果,这对计算机来说很简单,按顺序来就行了。
再看一个复杂点的前缀表达式:

代码如下:

- * / 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

这是一个前缀表达式的计算过程,可以看出每次只需计算第一个满足操作符后跟两个操作数的式子,直到最后就是结果了。

2.中缀表示法

这也就是我们一般的表示法,他的操作符置于操作数的中间(例:1 + 2),前面也说过这种方法不容易被计算机解析,但他符合人们的普遍用法,许多编程语言也就用这种方法了。在中缀表示法中括号是必须有的,要不然运算顺序会乱掉。因为很常用我也就不多讲了。

3.后缀表示法

后缀表示法又叫逆波兰表示法,他的操作符置于操作数的后面(例:1 2 +),他和前缀表示法都对计算机比较友好,但他很容易用堆栈解析,所以在计算机中用的很多。他的解释过程一般是:操作数入栈;遇到操作符时,操作数出栈,求值,将结果入栈;当一遍后,栈顶就是表达式的值。因此逆波兰表达式的求值使用堆栈结构很容易实现,和能很快求值。
注意:逆波兰记法并不是简单的波兰表达式的反转。因为对于不满足交换律的操作符,它的操作数写法仍然是常规顺序,如,波兰记法“/ 6 3”的逆波兰记法是“6 3 /”而不是“3 6 /”;数字的数位写法也是常规顺序。
为了更好的了解前缀表达式的计算过程,举个例子:5 1 2 + 4 * + 3 -,计算过程如下

代码如下:

栈空间     //解释说明
5
5 1
5 1 2
5 3       //遇到+,1和2出栈,得3,入栈
5 3 4
5 12      //遇到*,3和4出栈,得12,入栈
17        //遇到+,5和12出栈,得17,入栈
17 3
14        //遇到-,17和3出栈,得14,入栈

最后在栈里只有一个操作数,这就是计算结果。由此我们可以看出用堆栈是很容易解析后缀表达式的。

4.表示法间转化

这里介绍一种简单的中缀表达式转化前后缀表达式的方法,比如这个式子:a+b*c-(d+e)。
1.按照运算符的优先级对所有的运算单位加括号
式子变成:((a+(b*c))-(d+e))。
2.1.前缀表达式,把运算符号移动到对应的括号前面
式子变成:-( +(a *(bc)) +(de))
去掉括号:-+a*bc+de
2.2.后缀表达式,把运算符号移动到对应的括号后面
式子变成:((a(bc)* )+ (de)+ )-
去掉括号:abc*+de+-

(0)

相关推荐

  • C#计算器编写代码

    利用C#编写一个计算器.如下图,能够完成基本的四则运算. 当然这个程序甚至还不上Windows附件那个自带的多功能计算器.  不过这个程序的逻辑还是非常值得思考的,首先你要考虑好用户按+ - * / =等运算符号.数字键之后计算器的状态记录问题.  然后要防止多次按某一个键的问题.比如小数点.就不应该让用户在输入一个数的时候键入两次.  最后,还要弄两个数组,一个存放用户在输入的数字,另一个存放用户输入的符号.  制作过程如下,  1.布局如下,同时可以参考<简单实现C#窗体程序判断是否闰年 >

  • c#入门之实现简易存款利息计算器示例

    本想把练习题做了的结果放上来,不过发现附录是有答案的,就算了吧,自己做了没问题就行了哈.之前提到过,要是有朋友有想法,需要做小工具我可以帮忙实现,不过貌似大家都很忙.SO,自己学完第4章后,决定做一个工具:简易存款利息计算器,可以更好地复习前面学过的知识. 原理介绍为啥叫简易呢,因为现在只能计算整存整取(只有1.2.3.5四种年限哈)的利息,并且没有启用自动转存(俗称利滚利,就是把本年和上年的利息之和,作为下年利息计算时的本金)功能,方便和网上已有的工具对比计算结果,判断自己的程序算出来正不正确

  • C#实现Winform版计算器

    本文实例为大家分享Winform版计算器的具体实现方法,供大家参考,具体内容如下 前台页面设计 后台代码实现 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace 计

  • C#实现简单的计算器功能完整实例

    本文实例讲述了C#实现简单的计算器功能.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Collections; usi

  • C#中math类的全部运算方法(总结)

    如下所示: Abs 返回指定数字的绝对值. Acos 返回余弦值为指定数字的角度. Asin 返回正弦值为指定数字的角度. Atan 返回正切值为指定数字的角度. Atan2 返回正切值为两个指定数字的商的角度. BigMul 生成两个 32 位数字的完整乘积. Ceiling 返回大于或等于指定数字的最小整数. Cos 返回指定角度的余弦值. Cosh 返回指定角度的双曲余弦值. DivRem 计算两个数字的商,并在输出参数中返回余数. Exp 返回 e 的指定次幂. Floor 返回小于或等

  • C#日历样式的下拉式计算器实例讲解

    本文介绍了如何在Visual Studio中创建用户控件来显示下拉式计算器,弹出效果类似于日历控件. 介绍 如果我们正在做一个类似于库存控制和计费系统的项目,有些部分可能必须手动计算数值.因此,用户就不得不使用计算器得到结果,再填入到输入字段中,或者在工作窗口上单独打开一个计算器窗口.总之,各种不便和麻烦. 这篇文章主要描述的是如何添加下拉式计算器到DataGridView单元格中,如下图: 使用代码 第一步,我们必须先创建一个函数计算器,并且能够使用控件.因此,不妨先创建一个Visual St

  • C#基于纯数学方法递归实现货币数字转换中文功能详解

    本文实例讲述了C#基于纯数学方法递归实现货币数字转换中文功能.分享给大家供大家参考,具体如下: 最近由于项目的原因,需要写一个货币数字转换中文的算法,先在网了找了一下,结果发现无一列外都是用(Replace)替换的方式来实现的,所以想写个另外的算法:因为本人是学数学出身的,所以用纯数学的方法实现. 注意:本文中的算法支持小于1023 (也就是9999亿兆)货币数字转化. 货币中文说明: 在说明代码之前,首先让我们回顾一下货币的读法. 10020002.23  读为 壹仟零贰万零贰元贰角叁分 10

  • C#编程自学之运算符和表达式

    我们了解完C#数据类型与变量之后,还会遇到变量之间的运算,例如计算两个数的和等等运算.那么,C#中都有那些常用的运算符呢?那么,往下看吧! 一.算数运算符 1.基本算数运算符 说到算数运算符,我们首先就应该可以想到我们数学中一些常用的运算符例如:加 减 乘 除 求余! 那么在C# 这些运算符都是如何表示的呢? 知道C#基本运算符的表示之后我们该如何去使用呢?那么我们来看段代码来看下什么是表达式. int a = 10; //定义一个整形变量a 值为10 int b = 20; //定义一个整形变

  • C#中矩阵运算方法实例分析

    本文实例讲述了C#中矩阵运算方法.分享给大家供大家参考.具体分析如下: 一.测试环境: 主机:XP 开发环境:VS2008 二.功能: 在C#中实现矩阵运算 三.源代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using Sy

  • C#编写的windows计算器的实例代码

    复制代码 代码如下: using System; using System.Drawing; using System.Windows; using System.Windows.Forms; using System.Collections; using System.ComponentModel; using System.Data; namespace comput {     /// <summary>     /// 这是一个计算器的简单实现.     /// </summar

随机推荐