堆栈解析算术表达式

中缀表达式就是通常所说的算术表达式,比如(1+2)*3-4。

后缀表达式是指通过解析后,运算符在运算数之后的表达式,比如上式解析成后缀表达式就是12+3*4-。这种表达式可以直接利用栈来求解。
中缀->后缀 就是运算符的出入栈,操作数直接输出,运算符按优先级高(低)是入(出)栈。

运算符的优先级

优先级 运算符
1 括号()
2 负号-
3 乘方**
4 乘*,除/,求余%
5 加+,减-
6 小于<,小于等于<=,大于>,大于等于>=
7 等于==,不等于!=
8 逻辑与&&
9 逻辑或||

堆栈解析算术表达式的过程

中缀表达式翻译成后缀表达式的方法如下:

(1)从右向左依次取得数据ch。

(2)如果ch是操作数,直接输出。

(3)如果ch是运算符(含左右括号),则:
      a:如果ch = '(',放入堆栈。
      b:如果ch = ')',依次输出堆栈中的运算符,直到遇到'('为止。
      c:如果ch不是')'或者'(',那么就和堆栈顶点位置的运算符top做优先级比较。
           1:如果ch优先级比top高,那么将ch放入堆栈。
           2:如果ch优先级低于或者等于top,那么输出top,然后将ch放入堆栈。

(4)如果表达式已经读取完成,而堆栈中还有运算符时,依次由顶端输出。

如果我们有表达式(A-B)*C+D-E/F,要翻译成后缀表达式,并且把后缀表达式存储在一个名叫output的字符串中,可以用下面的步骤。

(1)读取'(',压入堆栈,output为空
(2)读取A,是运算数,直接输出到output字符串,output = A
(3)读取'-',此时栈里面只有一个'(',因此将'-'压入栈,output = A
(4)读取B,是运算数,直接输出到output字符串,output = AB
(5)读取')',这时候依次输出栈里面的运算符'-',然后就是'(',直接弹出,output = AB-
(6)读取'*',是运算符,由于此时栈为空,因此直接压入栈,output = AB-
(7)读取C,是运算数,直接输出到output字符串,output = AB-C
(8)读取'+',是运算符,它的优先级比'*'低,那么弹出'*',压入'+",output = AB-C*
(9)读取D,是运算数,直接输出到output字符串,output = AB-C*D
(10)读取'-',是运算符,和'+'的优先级一样,因此弹出'+',然后压入'-',output = AB-C*D+
(11)读取E,是运算数,直接输出到output字符串,output = AB-C*D+E
(12)读取'/',是运算符,比'-'的优先级高,因此压入栈,output = AB-C*D+E
(13)读取F,是运算数,直接输出到output字符串,output = AB-C*D+EF
(14)原始字符串已经读取完毕,将栈里面剩余的运算符依次弹出,output = AB-C*D+EF/-

计算算术表达式

后缀表达式按照下面的流程来计算。
现在是操作数入栈,运算符进行两两比较。

(1)从左向右扫描表达式,一个取出一个数据data
(2)如果data是操作数,就压入堆栈
(3)如果data是操作符,就从堆栈中弹出此操作符需要用到的数据的个数,进行运算,然后把结果压入堆栈
(4)如果数据处理完毕,堆栈中最后剩余的数据就是最终结果。

比如我们要处理一个后缀表达式1234+*+65/-,那么具体的步骤如下。

(1)首先1,2,3,4都是操作数,将它们都压入堆栈
(2)取得'+',为运算符,弹出数据3,4,得到结果7,然后将7压入堆栈
(3)取得'*',为运算符,弹出数据7,2,得到数据14,然后将14压入堆栈
(4)取得'+',为运算符,弹出数据14,1,得到结果15,然后将15压入堆栈
(5)6,5都是数据,都压入堆栈
(6)取得'/',为运算符,弹出数据6,5,得到结果1.2,然后将1.2压入堆栈
(7)取得'-',为运算符,弹出数据15,1.2,得到数据13.8,这就是最后的运算结果

时间: 2024-11-08 23:30:51

堆栈解析算术表达式的相关文章

ExpressionJ v0.3.4发布 解析简单算术表达式的Java类库

ExpressionJ 是一个用来解析简单的算术表达式的 Java 类库. ExpressionJ is a Java library allowing to interpret simple numeric expressions, which may be used in all applications which have to combine numeric http://www.aliyun.com/zixun/aggregation/9541.html">values, bu

ExpressionJ 0.8 Beta 1发布 解析简单算术表达式的Java类库

ExpressionJ 0.8 Beta 1此版本现在所有的单元都测试通过,并在相同的情况下,性能比0.7版本相比似乎提升了50%-100%. ExpressionJ 是一个用来解析简单的算术表达式的Java类库. 下载地址:http://sourceforge.net/projects/expressionj/files/920.html">Release%200.8/

ExpressionJ 0.7发布 解析简单算术表达式的Java类库

ExpressionJ 0.7该版本现在可以在函数中使用任何表达式,甚至是任何自定义函数表达式.例如,允许使用"function(a+1)"或"function2(a, c - function3(a, b * sin(a))). ExpressionJ 是一个用来解析简单的算术表达式的Java类库. 下载地址:http://sourceforge.net/projects/expressionj/files/920.html">Release%200.7/e

javascript中解析四则运算表达式的算法和示例_javascript技巧

在编写代码时我们有时候会碰到需要自己解析四则运算表达式的情况,本文简单的介绍使用JavaScript实现对简单四则运算表达式的解析. 一.熟悉概念 中缀表示法(或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4).也就是我们最常用的算术表达式,中缀表达式对于人类来说比较容易理解,但是不易于计算机解析. 逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式

C#算术表达式求值

算术表达式求值是一个经典的问题,很多学习编程的人都对此不陌生.本来我并不想写一个算术表达式求值的算法.在网上我看到了一篇文章,名叫<快速精确的对数学表达式求值>( http://www-128.ibm.com/developerworks/cn/java/j-w3eva/ ).才有兴趣着一个玩玩.写来写去,觉得真得很经典.所以把我写的代码拿出来让大家看看吧.因为时间较紧.所以变量名没有做得很规范. w3eavl是用JAVA写得,我用C#把它重写了一下.基本上能用,只是三角函数/反三角函数/双曲

ExpressionJ v0.3.3发布 Java类库数字算术表达式

ExpressionJ是一个Java类库用于解析简单的数字算术表达式. 该版本修复了重置 FunctionsDefinitions的bug. This project was registered on SourceForge.net on Dec 31, 2010, and is described by the project team as follows: ExpressionJ is a Java library allowing to interpret simple numeric

C#算术操作符和算术表达式

C#中提供的算术操作符有五种: ●+ 加法操作符 ●- 减法操作符 ●* 乘法操作符 ●/ 除法操作符 ●% 求余操作符 在表达式的运算中,表达式总是按它们本身书写的顺序求值,如下例: 程序清单7-1: using System; class Test { static void F(int x,int y,int z){ Console.WriteLine("x={0},y={1},z={2}",x,y,z); } public static void Main(){ int i=0

abcde-怎样用c实现链栈的算术表达式运算,不得使用stl模板

问题描述 怎样用c实现链栈的算术表达式运算,不得使用stl模板 按照严蔚敏版的书上的算法,用c语言链栈实现,不让使用stl模板,有没有原代码 解决方案 #include""stdio.h"" #include""stdlib.h"" #include""string.h"" #include""math.h"" #define true 1 #de

malloc-数据结构用栈实现算术表达式的求值运算

问题描述 数据结构用栈实现算术表达式的求值运算 小白一枚,最近用栈实现算术表达式的求值运算结果出现好多问题,单独的加减乘除运算都能够实现,但一旦加上括号运算就停在那命令窗口也不能输入信息,跪求大神指点原因 附上代码和截图: #include #include #include #define STACK_INIT_SIZE 100 //存储空间初始分配量; #define S 10 //存储空间分配增量; #define OK 1 #define ERROR 0 typedef int Elem