摘要:题目中也给出了例子。因为没有更高优先级的运算符,因此一旦我们遇到连续的形式,就可以立刻计算出结果。目前的想法是,一旦遇到括号,就将括号内的内容作为一个新的起点进行计算,但是括号前的内容也就是括号所位于的上下文需要通过栈来记录。
题目要求
Implement a basic calculator to evaluate a simple expression string. The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces . You may assume that the given expression is always valid. Some examples: "1 + 1" = 2 " 2-1 + 2 " = 3 "(1+(4+5+2)-3)+(6+8)" = 23 Note: Do not use the eval built-in library function.
实现一个简单的计算器,这个计算器可以计算以String为输入的中序表达式。这个中序表达式包含(),+,-和数字。题目中也给出了例子。
还有一个比较特殊的情况为(3)-(4)-(5) = -6
其实这道题等价于如何计算中序表达式,且比四则运算还要简单因为没有*和/。我们除了可以选择将其转化为后序表达式然后再对后序表达式进行,还可以在一次遍历的过程中就将其计算出来。
因为没有更高优先级的运算符,因此一旦我们遇到连续的a+b形式,就可以立刻计算出结果。我们需要考虑的特殊情况是一旦遇到括号应该怎么办。
目前的想法是,一旦遇到括号,就将括号内的内容作为一个新的起点进行计算,但是括号前的内容(也就是括号所位于的上下文)需要通过栈来记录。那么这个上下文应该存储什么内容呢?应该是括号前的符号以及括号前至上一个括号的计算结果。
这里讲的有点复杂了,我们可以看一个例子来理解一下。
现在我们要计算3+4-7+(5-9-(4)+6)-1这个式子,我们使用result来记录当前的结果,用sign来记录当前计算结果的正负性,再用一个栈s来记录上下文情况。那么遍历过程如下:
1.3+4-6-(5-9-(4)+6)-1 result = 3 sign=1 s=[]
2.3+4-6-(5-9-(4)+6)-1 result = 3 sign=1 s=[]
3.3+4-6-(5-9-(4)+6)-1 result = 7 sign=1 s=[]
4.3+4-6-(5-9-(4)+6)-1 result = 7 sign=-1 s=[]
5.3+4-6-(5-9-(4)+6)-1 result = 1 sign=-1 s=[]
6.3+4-6-(5-9-(4)+6)-1 result = 1 sign=-1 s=[]
7.3+4-6-(5-9-(4)+6)-1 result = 1 sign=1 s=[1,-1] 这时栈中的内容分别带包前面已经计算的值0和该位的正负形-1。同时因为即将开始一个新的计算,要将result初始化为0,sign初始化为1
8.3+4-6-(5-9-(4)+6)-1 result = 5 sign=1 s=[1,-1]
9.3+4-6-(5-9-(4)+6)-1 result = 5 sign=-1 s=[1,-1]
10.3+4-6-(5-9-(4)+6)-1 result = -4 sign=-1 s=[1,-1]
11.3+4-6-(5-9-(4)+6)-1 result = -4 sign=-1 s=[1,-1]
12.3+4-6-(5-9-(4)+6)-1 result = 0 sign=1 s=[1,-1,-4,-1]
13.3+4-6-(5-9-(4)+6)-1 result = 4 sign=1 s=[1,-1,-4,-1]
14.3+4-6-(5-9-(4)+6)-1 result = 4*(-1)-4=-8 sign=1 s=[1,-1] 遇到右括号,将栈中的上下文和当前的结果result进行计算得出括号中的最终结果
15.3+4-6-(5-9-(4)+6)-1 result = -8 sign=1 s=[1,-1]
16.3+4-6-(5-9-(4)+6)-1 result = -2*(-1) + 1=3 sign=1 s=[]
17.3+4-6-(5-9-(4)+6)-1 result = 3 sign=-1 s=[]
18.3+4-6-(5-9-(4)+6)-1 result = 2 sign=-1 s=[]
代码如下:
public int calculate(String s) { int len = s.length(), sign = 1, result = 0; Stackstack = new Stack (); for (int i = 0; i < len; i++) { if (Character.isDigit(s.charAt(i))) { int sum = s.charAt(i) - "0"; while (i + 1 < len && Character.isDigit(s.charAt(i + 1))) { sum = sum * 10 + s.charAt(i + 1) - "0"; i++; } result += sum * sign; } else if (s.charAt(i) == "+") sign = 1; else if (s.charAt(i) == "-") sign = -1; else if (s.charAt(i) == "(") { stack.push(result); stack.push(sign); result = 0; sign = 1; } else if (s.charAt(i) == ")") { result = result * stack.pop() + stack.pop(); } } return result; }
想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/68135.html
摘要:复杂度思路用两个来分别记录当前的结果和操作符注意每一次统计当前的的时候,要看一下下一位的操作符。有一种的方法,是表示的是匹配任意的空白符,包括空格,制表符,换行符,中文全角空格等。也可以用更简单的方法,。 LeetCode[227] Basic Calculator II Implement a basic calculator to evaluate a simple expres...
Problem Implement a basic calculator to evaluate a simple expression string. The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and e...
摘要:复杂度思路将字符串先转换成后缀表达式,再将其出来。 Leetcode[224] Basic Calculator Implement a basic calculator to evaluate a simple expression string. The expression string may contain open ( and closing parentheses ),...
Problem Implement a basic calculator to evaluate a simple expression string. The expression string contains only non-negative integers, +, -, *, / operators and empty spaces . The integer division sho...
Problem Implement a basic calculator to evaluate a simple expression string. The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and e...
阅读 2599·2021-11-17 09:33
阅读 3940·2021-10-19 11:46
阅读 912·2021-10-14 09:42
阅读 2254·2021-09-22 15:41
阅读 4205·2021-09-22 15:20
阅读 4630·2021-09-07 10:22
阅读 2304·2021-09-04 16:40
阅读 813·2019-08-30 15:52