题目地址:牛客网
描述
请写一个整数计算器,支持加减乘三种运算和括号。
数据范围:0\le |s| \le 1000≤∣s∣≤100,保证计算结果始终在整型范围内
要求:空间复杂度: O(n)O(n),时间复杂度 O(n)O(n)
示例1
输入:
"1+2"
复制返回值:
3
复制
示例2
输入:
"(2*(3-4))*5"
复制返回值:
-10
复制
示例3
输入:
"3+2*3*4-1"
复制返回值:
26
思路:
之前一篇写了,这题也是套用了那题的代码。
代码:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
int solve(string a) {
a=a+'@';
// write code here
for(int i=0; i<a.length()-1;i++)
{
if(i==0&&a[i]=='-')
a='0'+a;
else if(a[i]=='-'&&a[i-1]=='(')//右括号后面的负号
a.insert(i,"0");//在第i位置插入0
}
map<char, int> p;
p['+']=p['-']=1;
p['*']=p['/']=2;
p['(']=0;
queue<char> h;//后缀
stack<char> f;//符号
for(int i=0;i<a.length()-1;i++)
{
if(a[i]>='0'&&a[i]<='9'){
h.push(a[i]);
if(!(a[i+1]>='0'&&a[i+1]<='9')){
h.push(' ');
}
}
else{
if(a[i]=='('){
f.push(a[i]);
}
else if(a[i]==')'){
while(f.top()!='(')
{
h.push(f.top());
f.pop();
}
f.pop();
}
else
{
while(f.size()&&p[f.top()]>=p[a[i]]){
h.push(f.top());
f.pop();
}
f.push(a[i]);
}
}
}
while(f.size()){
h.push(f.top());
f.pop();
}
//求后缀
stack<int> s;
int t=0;
while(h.size()){
char b=h.front();
h.pop();
int c=0,d=0;
int sum=0;
if(b==' '){
s.push(t);
t=0;
}
else if(b>='0'&&b<='9')
{
t=t*10+int(b-'0');
}
else{
d=s.top();
s.pop();
c=s.top();
s.pop();
if(b=='+')sum=c+d;
else if(b=='-')sum=c-d;
else if(b=='*')sum=c*d;
else sum=c/d;
s.push(sum);
}
}
return s.top();
}
};