面试题 16.26. 计算器 给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。
表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: “3+2*2” 输出: 7 示例 2:
输入: " 3/2 " 输出: 1 示例 3:
输入: " 3+5 / 2 " 输出: 5
算法题很多时候考的是看待问题的思路
把3-2*5 看成 3+(-2)*5
这样一来就可以先识别乘法 全变成加法
int calculate(char* s){
//此题用栈的知识
//因为我们知道这道题的难点就在于符号之间的优先级 有的东西不能提前算
//先算乘除 再算加减
//所以 扫描一遍字符串把乘除先算出来 -正数变成+负数
//这样就可以全部用+来算
int len = strlen(s);
int *stack = (int*)malloc(sizeof(int) * len);
int top = 0;
char oper = '+';
int res = 0;
int num = 0;
int i;
char ch;
/* 字符串处理一遍即可 */
for (i = 0; i <= len; i++) {
ch = s[i];
if (ch == ' ') { /* 空格跳过 */
continue;
}
if (ch >= '0' && ch <= '9') { /* 数字拼起来 */
num = num * 10 + (ch - '0');
} else { /* 记录当前运算符, 先处理上一个运算符 */
if (oper == '+') {
stack[top++] = num;
} else if (oper == '-') {
stack[top++] = -num;
} else if (oper == '*') {
stack[top - 1] = stack[top - 1] * num;
} else if (oper == '/') {
stack[top - 1] = stack[top - 1] / num;
}
oper = ch;
num = 0;
}
}
/* 栈非空时, 栈元素相加 */
while (top > 0) {
res += stack[--top];
}
return res;
}