Java解析字符串表达式--逆波兰表达式的生成

上回讲了如何计算后缀表达式,其实真正的难点在于如何将一个正常的字符串表达式(中缀表达式)变成一个后缀表达式。如将6 * ( 5 + ( 2 + 3) * 8 + 3)变为6 5 2 3 + 8 * + 3 + *

逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀表达式。这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子:

正常的中缀表示 逆波兰表达式
a+b a,b,+
a+(b-c) a,b,c,-,+
a+(b-c)*d a,b,c,-,d,*,+
a+d*(b-c) a,d,b,c,-,*,+

首先约定表达式中运算符的优先级,从大到小依次为:()、* 和 /、+ 和 -。暂时只考虑四则运算。

顺序读取字符串表达式,规则:

  1. 读到的是操作数,直接输出;
  2. 读到的是操作符(+-*/)(记为read),将其与栈顶的操作符(记为top)进行优先级比较:read>top,read入栈,继续读下一个;read≤top,top出栈,并输出到list中,read继续和新的top比较;top为空,read直接入栈;若top是“(”,read直接入栈,因为“(”优先级最高;
  3. 括号的处理:读到左括号“(”,直接将其压入栈中,并且除非遇到右括号“)”,“(”是不会弹出的;读到右括号“)”,将“(”之上的元素全部依次输出,并弹出“(”但不输出;

准备:一个栈stack暂存运算符,一个list存放输出,仍以6 * ( 5 + ( 2 + 3) * 8 + 3)为例。

  1. 读到“6”,直接输出【list:6;stack:】
  2. 读到“*”,与栈顶top比较,top为空,“*”入栈【list:6;stack:*】
  3. 读到“(”,直接入栈【list:6;stack:*,(】
  4. 读到“5”,直接输出【list:6,5;stack:*,(】
  5. 读到“+”,与栈顶top比较,“+”<“(”,入栈【list:6,5;stack:*,(,+】
  6. 读到“(”,直接入栈【list:6,5;stack:*,(,+,(】
  7. 读到“2”,直接输出【list:6,5,2,;stack:*,(,+,(】
  8. 读到“+”,与栈顶“(”比较,“+”<“(”,入栈【list:6,5,2,;stack:*,(,+,(,+】
  9. 读到“3”,直接输出【list:6,5,2,3,;stack:*,(,+,(,+】
  10. 读到“)”,输出“(”之上的元素【list:6,5,2,3,+;stack:*,(,+,】
  11. 读到“*”,与栈顶的“+”比较, “*”>“+”,“*”入栈【list:6,5,2,3,+;stack:*,(,+,*,】
  12. 读到“8”,直接输出【list:6,5,2,3,+,8,;stack:*,(,+,*,】
  13. 读到“+”,与栈顶的“*”比较,“+”<“*”,“*”出栈并输出【list:6,5,2,3,+,8,*;stack:*,(,+,】;
  14. “+”,与栈顶的“+”比较,“+”=“+”,“+”出栈并输出【list:6,5,2,3,+,8,*,+;stack:*,(,】;
  15. “+”,与栈顶的“(”比较,“+”<“(”,“+”入栈【list:6,5,2,3,+,8,*,+;stack:*,(,+】;
  16. 读到“3”,直接输出,【list:6,5,2,3,+,8,*,+,3;stack:*,(,+】
  17. 读到“)”,输出“(”之上的元素,【list:6,5,2,3,+,8,*,+,3,+;stack:*,】
  18. 输出栈中所有剩下的,【list:6,5,2,3,+,8,*,+,3,+,*;stack:,】
  19. 最终的后缀表达式就是:6 5 2 3 + 8 * + 3 + *

至此,中缀表达式到后缀表达式的任务已经全部完成!

但是需要注意的是,本文中只是做了当运算数据为个位数的处理,当为多位数时该怎么做呢?

另外当遇到“/”处时,要对被除数进行非0判断;

另外还可以考虑含有负数的运算,含有小数的以及幂运算

那都是数据如何处理的问题了,整体思路应该都差不多!

时间: 2024-08-26 07:55:58

Java解析字符串表达式--逆波兰表达式的生成的相关文章

JavaScript实现计算后缀表达式(逆波兰表达式)以及将中缀表达式转为后缀表达式

逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出.逆波兰表达式又叫做后缀表达式.这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子: 正常的表达式 逆波兰表达式 a+b ---> a,b,+ a+(b-c) ---> a,b,c,-,+ a+(b-c)d ---> a,d,b,c,-,,+ a=1+3 ---> a=1,3 + http=(smtp+http+telnet)/1024 写成什么呢? http=smtp,http,telnet,+,+,1

Java解析字符串表达式--逆波兰表达式的计算

问题来由: 读入一个字符串形式的四则运算表达式,输出对应的计算结果.如读入的是"6 * ( 5 + ( 2 + 3) * 8 + 3)",那么解析后的输出结果应为288. 思路: 一般的计算过程是这样的,首先计算优先级最高的小括号里面的内容,即"( 5 + ( 2 + 3) * 8 + 3)", 将"2 + 3"的计算结果并存为A,接着用计算"A*8",并存为B 计算"5+B+3",结果存为C 最后计算&q

栈的应用之中缀表达式转化为后缀表达式(逆波兰表达式)

1 #include<stdio.h> 2 #include<stdlib.h> 3 4 #define OK 1 5 #define ERROR 0 6 #define STACK_INIT_SIZE 20 7 #define STACK_INCREMENT 10 8 9 typedef char Elemtype; 10 typedef int Status; 11 12 typedef struct StackNode{ 13 Elemtype* base; 14 Elemt

【LeetCode刷题Java版】Evaluate Reverse Polish Notation(计算逆波兰表达式)

Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, *, /. Each operand may be an integer or another expression. Some examples: ["2", "1", "+", "3", "*"] -&g

求解逆波兰表达式(前缀表达式)

首先介绍一下逆波兰表达式 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4. 这个表达式的求法有很多种 这里介绍一种用递归求解的方法.. 时间复杂度O(n); 首先我们需要把表达式转换成运算符和数字. 用一个数组记录i位置是数字还是运算符. 如果是数字是浮点数的话可使用atof(str)把字符串转换为一个doubl

北京大学 程序设计与算法(二)逆波兰表达式

用递归解决递归形式的问题 逆波兰表达式 逆波兰表达式是一种把运算符前置的算数表达式,例如普通的表达式2+3的逆波兰表示法为+2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2+3)*3的逆波兰表示法为*+234.本题求解逆波兰表达式的值,其中运算符包括+-*/四个. 输入 输入为一行,其中运算符和运算数之间都用空格分隔,运算符是浮点数 输出 输出为一行,表达式的值. *+11.0 12.0 +24.0 35.0 --à(11.0+12.0)*(24.0+3

逆波兰表达式(后缀表达式)

逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出.逆波兰表达式又叫做后缀表达式.下面是一些例子: 正常的表达式 逆波兰表达式 a+b ---> a,b,+ a+(b-c) ---> a,b,c,-,+ a+(b-c)*d ---> a,b,c,-,d,*,+ a+d*(b-c)--->a,d,b,c,-,*,+ a=1+3 ---> a=1,3 + 通过后缀表达式计算表达式值的过程:顺序访问表达式的每一项,若该项为操作数,则将其压入栈中:若该项是操作符<o

简单计算机——逆波兰表达式

逆波兰数:逆波兰数由两部分组成(操作数,操作符)--是波兰表达式的一种,即操作符在操作数的后面. 形式:A+B*C-D = ABC*D-; (A+B)*C-D = AB+C*D-; 既然我们知道了,后缀表达式那我们表达式是唯一的吗?我们来看一组数据: 例如:(A+B)*C-D 和 C*(A+B)-D; 很显然第二个的表达式为:C*AB+D-;虽然对最后的结果无影响,但我们需要知道逆波兰的多样性. 注意事项: 1.如果出现1+23 = 123+,该如何判断它的数值呢? 可以利用分割符来进行很好的辅

递归--逆波兰表达式

用递归解决递归形式的问题例题:逆波兰表达式逆波兰表达式是一种把运算符前置的算术表达式(其实一般教科书上称这种表达式为波兰表达式) ,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入:输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数 输出:输出为一行,表达式的值. 简单来说,这种