【算法刷题日记】LeetCode 227 基本计算器 II|栈处理运算优先级 C 语言
刷题日期:2026.5.3
题目:227. 基本计算器 II难度:中等语言:C 语言
优秀题解:https://leetcode.cn/problems/basic-calculator-ii/solutions/91271/chai-jie-fu-za-wen-ti-shi-xian-yi-ge-wan-zheng-ji-/
一、看到题目的第一想法
题目要求计算带+ - * /的表达式,还有空格,必须处理运算优先级。第一反应:
- 乘除优先级高,遇到立刻算
- 加减先入栈,最后统一加
- 用栈完美解决,时间 O (n),最优解!
二、解题思路(栈)
- 数字收集:支持 123、456 这种多位数
- 运算符判断:
+:直接入栈-:入栈负数*/:立即和栈顶计算,结果覆盖栈顶
- 最后把栈里所有数字相加,就是最终结果
- 自动跳过空格
三、AC 代码(C 语言)
c运行
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> int calculate(char * s){ int len = strlen(s); int* stack = (int*)malloc(len * sizeof(int)); int top = 0; int num = 0; char op = '+'; for(int i = 0; i < len; i++){ // 收集数字 if(isdigit(s[i])){ num = num * 10 + (s[i] - '0'); } // 遇到运算符 or 末尾,执行计算 if((!isdigit(s[i]) && s[i] != ' ') || i == len - 1){ if(op == '+') stack[top++] = num; else if(op == '-') stack[top++] = -num; else if(op == '*') stack[top-1] *= num; else if(op == '/') stack[top-1] /= num; op = s[i]; num = 0; } } // 求和 int res = 0; for(int i = 0; i < top; i++) res += stack[i]; free(stack); return res; }四、实现要点(必看)
多位数处理
num = num*10 + s[i]-'0'减法变负数入栈最后统一加法,最简洁
乘除直接算不用等,直接用栈顶计算
自动跳过空格代码里已经处理,不用额外判断
五、今日收获心得
表达式计算 = 栈逆波兰、计算器、括号运算,全是栈。
运算优先级最优解法乘除立即算,加减入栈最后加。
代码短、效率高、逻辑清晰面试笔试高频原题!
六、总结
LeetCode 227 是表达式计算必背题。记住一句话:乘除立即算,加减入栈,最后求和直接秒杀!
坚持每日一题,算法稳步提升!
