假设我们有一个简单的表达式字符串,并且我们必须实现一个基本的计算器来评估该表达式。表达式字符串可以包含开头和结尾括号,加号+或减号-,非负整数和空格。表达式字符串仅包含非负整数,+,-,*,/运算符,左括号和右括号以及空格。整数除法应截断为零。
因此,如果输入类似于“ 6-4 / 2”,则输出将为4
为了解决这个问题,我们将遵循以下步骤-
l1:= 0,l2:= 1
o1:= 1,o2:= 1
定义一个堆栈st
n:= s的大小
对于初始化i:= 0,当i <n时,更新(将i增加1),执行-
如果x等于'-'并且(i等于0或(i-1> = 0且s [i-1]等于'('))),则-
l1:= l1 + o1 * l2
o1:=(如果x与'+'相同,则为1,否则为-1)
l2:= 1,o2:= 1
o1:= -1
忽略以下部分,跳至下一个迭代
o2:=(如果x与'*'相同,则为1,否则为-1)
温度:= l1 + o1 * l2
o2:= st的顶部元素
从st删除元素
l2:= st的顶部元素
从st删除元素
o1:= st的顶部元素
从st删除元素
l1:= st的顶部元素
从st删除元素
l2:=(如果o2与1相同,则l2 * temp,否则l2 / temp)
将l1插入st,将o1插入st
将l2插入st,将o2插入st
l1:= 0,o2:= 1
o1:= 1,l2:= 1
num:= x-'0'
而(i + 1 <n和s [i + 1]> ='0'和s [i + 1] <='9'),则执行-
l2:=(如果o2与1相同,则l2 * num,否则为l2 / num)
(将i增加1)
num:=(num * 10)+(s [i]-'0')
x:= s [i]
如果x> ='0'并且x <='9',则-
否则,当x与'('相同时,则-
否则,当x与')'相同时,则-
否则,当x与'*'相同或x与'/'相同时,则-
否则,当x与'+'相同或x与'-'相同时,则-
返回l1 + o1 * l2
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
int calculate(string s) {
lli l1 = 0;
lli l2 = 1;
lli o1 = 1;
lli o2 = 1;
stack<lli> st;
lli n = s.size();
for (lli i = 0; i < n; i++) {
char x = s[i];
if (x >= '0' && x <= '9') {
lli num = x - '0';
while (i + 1 < n && s[i + 1] >= '0' && s[i + 1] <= '9') {
i++;
num = (num * 10) + (s[i] - '0');
}
l2 = (o2 == 1) ? l2 * num : l2 / num;
}
else if (x == '(') {
st.push(l1);
st.push(o1);
st.push(l2);
st.push(o2);
l1 = 0;
o2 = 1;
o1 = 1;
l2 = 1;
}
else if (x == ')') {
lli temp = l1 + o1 * l2;
o2 = st.top();
st.pop();
l2 = st.top();
st.pop();
o1 = st.top();
st.pop();
l1 = st.top();
st.pop();
l2 = (o2 == 1) ? l2 * temp : l2 / temp;
}
else if (x == '*' || x == '/') {
o2 = (x == '*') ? 1 : -1;
}
else if (x == '+' || x == '-') {
if (x == '-' && (i == 0 || (i - 1 >= 0 && s[i - 1] == '('))) {
o1 = -1;
continue;
}
l1 += o1 * l2;
o1 = (x == '+') ? 1 : -1;
l2 = 1;
o2 = 1;
}
}
return l1 + o1 * l2;
}
};
main(){
Solution ob;
cout << (ob.calculate("(5+9*3)/8"));
}"(5+9*3)/8"
输出结果
4