计算字符串表达式的值

计算字符串表达式的值

一、题目描述

给你一个字符串,包含+,-,*,/和(),数字为0-9,让计算该表达式的值,例如"1+2*3-(8/4)+6",结果为11,这是前几天面试去哪儿网,二面面试官让手撕的题目。记忆中本科的时候遇到过,当时也没啥思路。其实这个题需要分两步完成,第一步:把字符串表达式的中缀形式转为后缀形式,怎么转有一定的规则。第二步:计算后缀表达式的值。

关于什么是前缀,中缀,后缀表达式,请读者自己查阅资源,这里就不介绍了。我们只谈如何从中缀转为后缀,规则如下:

首先定义一个栈stack用来保存操作符,定义一个List保存后缀表达式的结果,令字符串的当前字符为c:

1、如果c为操作数,从'0' - '9',则直接添加到list中

2、如果c为操作符,例如+,-,*,/,首先判断栈是否为空,如果为空,则操作符入栈,如果不为空,当栈顶操作符的优先级比c的优先级高,或者相等的时候,把栈顶操作符弹出,并添加到list中,直到遇到左括号,或者栈顶元素的优先级比c低的时候停止。然后把操作符c入栈。

3、如果c为左括号,直接入栈

4、如果c为右括号,则依次弹出栈内的操作符并添加到list,直到遇到左括号。把左括号弹出,但是不添加到list。

5、当字符串中每个元素都遍历完后,把栈中所有的操作符全部弹出并添加到list中

上面的操作完成后,后缀表达式也就全部保存到了list中,然后我们就可以计算后缀表达式的值了。计算步骤如下:

先定义一个栈stack,用来保存操作数,以及中间结果,当遍历list的时候,如果当前元素为:

1、如果为操作数,则直接入栈

2、如果为操作符,则从栈中依次弹出2个元素b和a,然后根据操作符的不同,计算a xxx b的值,把计算结果压栈

3、当list遍历完后,栈中肯定只剩下一个元素,就是最终的结果。

二、代码演示

import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
import
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值