c#数学表示法(后缀表示法)详解
在笔试中有这么一道题目,写出一个表达式的后缀表示形式,当时就迷茫了,什么是后缀表达式,还真没听过。后来查了下原来是一种比较特殊的数学表达式,因为在日常生活中用的不多,不太了解。有三种表达式:前缀表达式、中缀表达式和后缀表达式。一般用的是中缀,比如1+1,前后缀就是把操作符移到前面和后面,下面我就来介绍一下这三种表达式。
1.前缀表示法
前缀表示法又叫波兰表示法,他的操作符置于操作数的前面(例:+12),是波兰数学家扬·武卡谢维奇1920年代引入的,用于简化命题逻辑。因为我们一般认为操作符是在操作数中间的,所以在日常生活中用的不多,但在计算机科学领域占有一席之地。一般的表示法对计算机来说处理很麻烦,每个符号都要考虑优先级,还有括号这种会打乱优先级的存在,将使计算机花费大量的资源进行解析。而前缀表示法没有优先级的概念,他是按顺序处理的。
举个例子:9-2*3这个式子,计算机需要先分析优先级,先乘后减,找到2*3,再进行减操作;化成前缀表示法就是:-9*23,计算机可以依次读取,操作符作用于后一个操作数,遇到减就是让9减去后面的数,而跟着9的是乘,也就是说让9减去乘的结果,这对计算机来说很简单,按顺序来就行了。
再看一个复杂点的前缀表达式:
-*/15-7+113+2+11
-*/15-7 2 3+2+11
-*/15 5 3+2+11
-* 3 3+2+11
- 9 +2+11
- 9 +2 2
- 9 4
5
这是一个前缀表达式的计算过程,可以看出每次只需计算第一个满足操作符后跟两个操作数的式子,直到最后就是结果了。
2.中缀表示法
这也就是我们一般的表示法,他的操作符置于操作数的中间(例:1+2),前面也说过这种方法不容易被计算机解析,但他符合人们的普遍用法,许多编程语言也就用这种方法了。在中缀表示法中括号是必须有的,要不然运算顺序会乱掉。因为很常用我也就不多讲了。
3.后缀表示法
后缀表示法又叫逆波兰表示法,他的操作符置于操作数的后面(例:12+),他和前缀表示法都对计算机比较友好,但他很容易用堆栈解析,所以在计算机中用的很多。他的解释过程一般是:操作数入栈;遇到操作符时,操作数出栈,求值,将结果入栈;当一遍后,栈顶就是表达式的值。因此逆波兰表达式的求值使用堆栈结构很容易实现,和能很快求值。
注意:逆波兰记法并不是简单的波兰表达式的反转。因为对于不满足交换律的操作符,它的操作数写法仍然是常规顺序,如,波兰记法“/63”的逆波兰记法是“63/”而不是“36/”;数字的数位写法也是常规顺序。
为了更好的了解前缀表达式的计算过程,举个例子:512+4*+3-,计算过程如下
栈空间 //解释说明
5
51
512
53 //遇到+,1和2出栈,得3,入栈
534
512 //遇到*,3和4出栈,得12,入栈
17 //遇到+,5和12出栈,得17,入栈
173
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+-
相关文章
- C#FindWindowEx参数详解
- C#正则表达式大全
- c#数组赋初值_C#数组初始化
- C# 判断文件/文件夹 是否存在
- 【愚公系列】2023年02月 .NET/C#知识点-委托、匿名方法、Lambda、泛型委托、表达式树的进化史
- 通过C#来加载X509格式证书文件并生成RSA对象详解编程语言
- C#简单应用spring的例子详解编程语言
- C操作MySQL数据库实现数据集查询(c# mysql 数据集)
- C编写一键备份Oracle数据库(c# 备份oracle)
- ASP.net(c#)打造24小时天气预报及实时天气
- C#获取属性名的方法
- C#SkinEngine控件给窗体添加皮肤的方法
- C#词法分析器之构造NFA详解
- 解析C#中委托的同步调用与异步调用(实例详解)
- 深入分析C#中WinForm控件之Dock顺序调整的详解
- 使用C#Winform应用程序获取网页源文件的解决方法
- 解析C#自定义控件的制作与使用实例的详解
- c#模拟平抛运动动画的方法详解
- 在c#中把字符串转为变量名并获取变量值的小例子
- C#中判断本地系统的网络连接状态的方法
- c#二分查找算法
- c#执行外部命令示例分享
- c#实现sqlserver事务处理示例
- C#中利用代理实现观察者设计模式详解
- c#的dllimport使用方法详解
- c#入门之枚举和结构体使用详解(控制台接收字符串以相反的方向输出)
- C#中使用Lambda表达式自定义比较器实现两个列表合并实例
- C#中lock用法详解
- C#的FileSystemWatcher用法实例详解
- c#Base64编码和图片的互相转换代码
- C#中struct和class的区别详解
- C#网络编程基础之进程和线程详解