中缀表达式到后缀表达式的转换
例:1+2*3*(3+5) ———— 23*35+*1+
逆波兰表达式算法:
网上大部分都是写通过两个栈的入栈与出栈进行操作,但是其中有一个是要以先入先出的顺序操作栈,不符合正常的JAVA的认知,因此改为操作数队列与栈,其实本质相同。
一、 将中缀表达式转换成后缀表达式算法:
1、从左至右扫描一中缀表达式。
2、若读取的是操作数,则判断该操作数的类型,并将该操作数输出至操作数队列(以下简称队列)
3、若读取的是运算符
(1) 该运算符为左括号"(",则直接存入运算符栈。
(2) 该运算符为右括号")",则输出运算符栈中的运算符到操作数队列,直到遇到左括号为止。并将左右括号从栈中取出。
(3) 该运算符为非括号运算符:
(a) 若运算符栈栈顶的运算符为括号,则直接存入运算符栈。
(b) 若比运算符栈栈顶的运算符优先级高,则直接存入运算符栈。
(c) 若比运算符栈栈顶的运算符优先级低或相等,则输出栈顶运算符到操作数队列,并将当前运算符压入运算符栈。
4、当表达式读取完成后运算符堆栈中尚有运算符时,则依序取出运算符到操作数队列,直到运算符栈为空。
二、实例分析
分析前,要明确各个运算符的优先级数。 由小到大依此为(注:以,为分隔): +-,*\,负号
例如 : 1+2*3*((-1)*3);
1.读取1压入队列,
2.读取“+”压入栈,
3.读取2压入队列,
4.读取“*” ,判断与栈顶元素“+”的优先级,大于,则压入栈。
5.读取3压入队列,
6.读取“*”,此时栈顶元素为“*” 优先级相同,则将栈顶元素“*”输出至队列。
7.读取“(”压入栈中。
8.读取“(”压入栈中。
9.读取“-(负号)”压入栈中。
10.读取1压入队列。
11.读取“)”,将 “-”号压入队列。队列中还剩一个“(”。
12.读取“*”压入栈中。
13.读取3压入队列。
14.读取“)”,将“*”号输出并压入队列。运算符栈中还剩 “*” 与“+”
15.将运算符栈清空,将“+“ 、“ * ” 依次压入队列。
15.操作数队列中 先入先出的顺序出栈,则,输出为:123*1-*3*+
嗯:还是有问题的,就是“-”负号的处理问题,希望可以得到指正。
代码明天手搓,今天先写个作业 。