题目大意:给你一个含有加减乘除还有幂运算符的含有括号的算术表达式,请算出他的结果。
题目描述
小明在你的帮助下,破译了Ferrari设的密码门,正要往前门,突然往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”、“)”、“0-9”、“+”、“-”、“*”、“/”“^”求出的值就是密码。小明数学学得不好,还需你帮他的忙。(“/”用整数除法)
输入
一行,输入一个算式
输出
一行,输出密码
样例输入
1+(3+2)*(7^2+6*9)/(2)
样例输出
258
提示
数据范围:
100%的数据满足:算式长度<=30,其中所有数据在231-1的范围内。
解题思路
一个数据栈,一个运算符栈,遇到数据,数据进数据栈,遇到运算符,运算符进运算符栈。最后计算的时候,从栈顶开始计算:取出一个运算符和两个数据,把计算结果雅慧数据栈,直到运算符栈为空,数据栈的那个数据即是答案。
按照上述方法,则靠近栈顶的运算符优先级高,靠近栈底的运算符优先级低。如果在进栈过程中,出现栈顶的优先级比前一个运算符优先级低(不高于),怎么办?那肯定是先计算前面的运算符。因此,在运算符压栈过程中,读入后一个数据前(43行代码),如果前面有应该先算的运算符(优先级高或者同级),则先算前面的。
最后一个问题,就是括号问题了。左括号是在获取数据时遇到的,这是先把括号当运算符压栈,i+1略过这个左括号后再继续获取数据。当遇到右括号时,运算符栈中,前一个左括号后面的运算符都要先算,则一直算到左括号(39行代码)。在判断优先级时,括号优先级很高,但左括号不能运算,故遇到括号不算,至少在遇到右括号时一直退栈。