当前位置:首页 > 数据结构 > > 正文
SSOJ2461计算
3962+

题目大意:给你一个含有加减乘除还有幂运算符的含有括号的算术表达式,请算出他的结果。

题目描述

小明在你的帮助下,破译了Ferrari设的密码门,正要往前门,突然往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”、“)”、“0-9”、“+”、“-”、“*”、“/”“^”求出的值就是密码。小明数学学得不好,还需你帮他的忙。(“/”用整数除法)

输入

一行,输入一个算式

输出

一行,输出密码

样例输入

1+(3+2)*(7^2+6*9)/(2)

样例输出

258

提示

数据范围:

100%的数据满足:算式长度<=30,其中所有数据在231-1的范围内。

解题思路

一个数据栈,一个运算符栈,遇到数据,数据进数据栈,遇到运算符,运算符进运算符栈。最后计算的时候,从栈顶开始计算:取出一个运算符和两个数据,把计算结果雅慧数据栈,直到运算符栈为空,数据栈的那个数据即是答案。

按照上述方法,则靠近栈顶的运算符优先级高,靠近栈底的运算符优先级低。如果在进栈过程中,出现栈顶的优先级比前一个运算符优先级低(不高于),怎么办?那肯定是先计算前面的运算符。因此,在运算符压栈过程中,读入后一个数据前(43行代码),如果前面有应该先算的运算符(优先级高或者同级),则先算前面的。

最后一个问题,就是括号问题了。左括号是在获取数据时遇到的,这是先把括号当运算符压栈,i+1略过这个左括号后再继续获取数据。当遇到右括号时,运算符栈中,前一个左括号后面的运算符都要先算,则一直算到左括号(39行代码)。在判断优先级时,括号优先级很高,但左括号不能运算,故遇到括号不算,至少在遇到右括号时一直退栈。

程序实现

About

坚决不Copy代码!

本文标签:,,,

SSOJ2461计算:等您坐沙发呢!

发表评论

您必须 [ 登录 ] 才能发表留言!