逆波兰表达式算法分析。

中缀表达式到后缀表达式的转换

例: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*+

 

嗯:还是有问题的,就是“-”负号的处理问题,希望可以得到指正。

代码明天手搓,今天先写个作业 。

 

 

转载于:https://my.oschina.net/kxln1314/blog/887120

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值