Basic_Calculator.png
/**
* Abstract: Utilize the system-provided stack-----recursion
*/
size_t parse_val(char *s, size_t n, size_t start, int *val) {
*val = 0;
while (start < n && isdigit(s[start])) { *val = 10 * *val + (s[start++] - '0'); }
return start;
}
int perform(int val1, int val2, char op) {
if (op == '-') { return val1 - val2; }
if (op == '+') { return val1 + val2; }
return 0;
}
int evaluate(char *s, size_t *start, size_t n) {
int val = 0;
char op = '\0';
while (*start < n) {
if (isdigit(s[*start])) {
int rval = 0;
*start = parse_val(s, n, *start, &rval);
if (op != '\0') {
val = perform(val, rval, op);
op = '\0';
} else {
val = rval;
}
} else if (s[*start] == '(') {
(*start)++;
int rval = evaluate(s, start, n);
if (op != '\0') {
val = perform(val, rval, op);
op = '\0';
} else {
val = rval;
}
} else if (s[*start] == ')') {
(*start)++;
return val;
} else if (s[*start] == ' ') {
(*start)++;
} else {
op = s[(*start)++];
}
}
return val;
}
int calculate(char * s) {
size_t start = 0;
return evaluate(s, &start, strlen(s));
}
网友评论