# 227-m-Basic Calculator II

int calculate(char* s) {
int result = 0;
int n = 4;
int numstack[n];
char operastack[n];
memset(numstack, 0, sizeof(int) * n);
memset(operastack, 0, sizeof(char) * n);
char *sp = s;
char *nums = "0123456789";
char *opera = "+-*/";
char *powerdivide = "*/";
char *plusminus = "+-";

int num = 0;
int indexo = 0, indexn = 0;
while (*sp != '\0') { //将操作数和操作符分别入栈
if (strchr(nums, *sp)) {
while (strchr(nums, *sp) && *sp != '\0') {
num = num * 10 + *sp - '0';
sp++;
}
numstack[indexn] = num;
indexn++;
if (indexo > 0 && strchr(powerdivide, operastack[indexo - 1])) { //如果是乘除则实时计算并结果入栈同时消掉符号和操作数
int temp = 0;
if (operastack[indexo - 1] == '*')
temp = numstack[indexn - 2] * numstack[indexn - 1];
else
temp = numstack[indexn - 2] / numstack[indexn - 1];
numstack[indexn - 2] = temp;
indexn--;
indexo--;
}
if (indexo > 1) { //在操作数大于等于3时直接计算头2个的结果，可以大幅降低空间复杂度，并降低时间复杂度
int temp = 0;
if (operastack[0] == '+')
temp = numstack[0] + numstack[1];
else if (operastack[0] == '-')
temp = numstack[0] - numstack[1];
numstack[0] = temp;
numstack[1] = numstack[2];
indexn--;
operastack[0] = operastack[1];
indexo--;
}
}
if (*sp == '\0')
break;
if (strchr(opera, *sp)) {
operastack[indexo] = *sp;
num = 0;
indexo++;
}
sp++;
}
//    for (int i = 0; i < indexo; i++) { //最后归结为加减运算
//        if (operastack[i] == '+') {
//            result = numstack[i] + numstack[i + 1];
//            numstack[i + 1] = result;
//        }
//        else if (operastack[i] == '-') {
//            result = numstack[i] - numstack[i + 1];
//            numstack[i + 1] = result;
//        }
//    }
if (operastack[0] == '+') { //由于入栈时直接计算过结果并保存在首元素，因此只需计算首2个元素即可
result = numstack[0] + numstack[1];
numstack[0] = result;
}
else if (operastack[0] == '-') {
result = numstack[0] - numstack[1];
numstack[0] = result;
}

//    if (indexo < 1) //如果没有操作符，则结果等于首个操作数
result = numstack[0];

return result;
}

• 本文已收录于以下专栏：

## LeetCode 227. Basic Calculator II

LeetCode 227. Basic Calculator II 时间复杂度O(n)，空间复杂度O(1)c++

## Basic Calculator II - LeetCode 227

• bu_min
• 2015年06月27日 11:24
• 322

## leetcode:227. Basic Calculator II

Implement a basic calculator to evaluate a simple expression string.The expression string contains o...

## LeetCode No.227 Basic Calculator II

LeetCode No.227 Basic Calculator II

## LeetCode227. Basic Calculator II

• codeTZ
• 2016年01月22日 17:50
• 242

## Leetcode 227 Basic Calculator II

1. 问题描述　　给遗传字符串类型的表达式，计算表达式的值。表达式只包含+、-、*、/和空格。 　　2. 方法与思路　　此题和Basic Calculator I类似，只是左右括号换成了乘除符号。基...

举报原因： 您举报文章：227-m-Basic Calculator II 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)