LeetCode 227. 基本计算器 II
使用传统栈后缀表达式+弹栈计算,爆时间爆内存,垃圾解法;
map<char, int>mp;
vector<string>bs;
void init() {
mp['+'] = 0;
mp['-'] = 0;
mp['*'] = 1;
mp['/'] = 1;
}
void back_string(string s) {
stack<char>sign;
int i = 0;
while(i<s.size()) {
if (s[i] >= '0' && s[i] <= '9') {
string ss = "";
while (s[i] >= '0' && s[i] <= '9') {
ss += s[i];
i++;
}
bs.push_back(ss);
}
else if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'){
if (sign.empty()) {
sign.push(s[i]);
}
else {
if (mp[s[i]] > mp[sign.top()]) {
sign.push(s[i]);
}
else {
while (!sign.empty() && mp[s[i]] <= mp[sign.top()]) {
string str = "";
str += sign.top();
bs.push_back(str);
sign.pop();
}
sign.push(s[i]);
}
}
i++;
}
else {
i++;
}
}
while (!sign.empty()) {
string str = "";
str += sign.top();
bs.push_back(str);
sign.pop();
}
}
int calculate(string s) {
init();
stack<int>st;
back_string(s);
int a, b;
int ret = 0;
for (int i = 0; i < bs.size(); i++) {
if (bs[i] == "+") {
a = st.top();
st.pop();
b = st.top();
st.pop();
st.push(a + b);
}
else if (bs[i] == "-") {
a = st.top();
st.pop();
b = st.top();
st.pop();
st.push(b - a);
}
else if (bs[i] == "*") {
a = st.top();
st.pop();
b = st.top();
st.pop();
st.push(a * b);
}
else if (bs[i] == "/") {
a = st.top();
st.pop();
b = st.top();
st.pop();
st.push(b / a);
}
else {
int cnt = 0;
for (int j = 0; j < bs[i].size(); j++) {
cnt = (bs[i][j] - '0') + cnt * 10;
}
st.push(cnt);
}
}
return st.top();
}
最快的写法应该是采用之前简单加减运算之上,增加乘除优先级即可;
遇到加减元素,标记正负号之后按照数字入栈;
如果遇到乘除符号,则两位操作数只可能是现在的遍历得数目和栈顶元素,所以弹栈计算之后进行压栈;
但是值得注意的是,每次判断都是根据presign进行的,所以每次计算落后于实际遍历操作;
最后只需要对栈内元素进行加和计算即可;
class Solution {
public:
int calculate(string s) {
vector<int> stk;
char preSign = '+';
int num = 0;
int n = s.length();
for (int i = 0; i < n; ++i) {
if (isdigit(s[i])) {
num = num * 10 + int(s[i] - '0');
}
if (!isdigit(s[i]) && s[i] != ' ' || i == n - 1) {
switch (preSign) {
case '+':
stk.push_back(num);
break;
case '-':
stk.push_back(-num);
break;
case '*':
stk.back() *= num;
break;
default:
stk.back() /= num;
}
preSign = s[i];
num = 0;
}
}
return accumulate(stk.begin(), stk.end(), 0);
}
};

浙公网安备 33010602011771号