本题描述:
请计算该表达式的值,并返回一个整数,表示表达式的结果。
注意事项:
- 有效的运算符包括
'+','-','*'和'/'。 - 每个操作数可以是整数或另一个表达式。
- 两个整数之间的除法总是向零截断(即,结果去掉小数部分,向零靠拢)。
- 不会有除以零的情况。
- 输入是一个有效的逆波兰表达式。
- 答案以及所有中间计算结果都可以用 32 位整数表示。
示例 1:
输入: tokens = ["2","1","+","3","*"]
输出: 9
解释: ((2 + 1) * 3) = 9
示例 2:
输入: tokens = ["4","13","5","/","+"]
输出: 6
解释: (4 + (13 / 5)) = 6
示例 3:
输入: tokens = ["10","6","9","3","+","-11","","/","","17","+","5","+"]
输出: 22
解释: ((10 * (6 / ((9 + 3) * -11))) + 17) + 5 = 22
约束条件:
1 <= tokens.length <= 10^4tokens[i]要么是运算符"+","-","*","/",要么是[-200, 200]范围内的整数。
做题思路总结:
- 使用一个整型栈
int stack; - 依次遍历 token:
- 是数字就转
int入栈。 - 是运算符
+/-/*//,弹出栈顶两个数(注意顺序:先右后左),按操作符计算,把结果入栈。
- 是数字就转
- 所有 token 处理完后,栈中最后一项即为结果。
关于字符串转 int 的函数
C 语言没有 str2int 这个标准函数。用法如下:
- 推荐用
strtol:int num = (int)strtol(token, NULL, 10); atoi也能用,但不建议。sscanf也可用,但写法更繁琐。
strtol 函数用法解析
原型: long int strtol(const char *nptr, char **endptr, int base);
nptr:要转换的字符串。endptr:转换结束后指针(不关心就填NULL)。base:进制(题目用 10)。
举例:
c
int num = (int)strtol(token, NULL, 10);
如果 token = "123" 转出来就是 123。
NULL 与 10 的含义
NULL表示不关心剩余未处理字符串。10代表十进制,如果写16就是十六进制。
总结
本题核心是逆波兰表达式与栈的结合 ,C 里字符串转 int 用 strtol(token, NULL, 10) 最稳妥。掌握这几个知识点,解此类表达式题目将很高效!