题目:

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。

示例 1:
输入:s = “3+2*2”
输出:7

示例 2:
输入:s = “ 3/2 “
输出:1

示例 3:
输入:s = “ 3+5 / 2 “
输出:5

提示:

  • 1 <= s.length <= 3 * 105
  • s 由整数和算符 (‘+’, ‘-‘, ‘*’, ‘/‘) 组成,中间由一些空格隔开
  • s 表示一个 有效表达式
  • 表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
  • 题目数据保证答案是一个 32-bit 整数

    解答:

    重点:

  • 有 +, - ,*,/ 四种运算符;

  • 没有括号。

既然包含 4 种运算符,那么就有运算符优先级的问题:先 ,/ ,再 +, - 。本题解的思路就是把所有的 ,/ 先计算出来,最后计算只有 +, - 运算符的表达式。

  • 使用一个「栈」只保存需要进行 +, - 运算符的所有数字(把- 运算符改成负数放到栈中)。
  • 如果遇到 *,/ 运算,则需要把结果先计算出来,也放到栈里;
  • 在把所有乘除法计算完成之后,最后对栈内数字求和。

但是注意栈顶元素由于后面可能遇到 *,/ 运算符,所以栈顶元素有可能还会被弹出来,跟后面的运算符做计算。

  1. class Solution {
  2. public int calculate(String s) {
  3. Stack<Integer> numStack = new Stack<>();
  4. char lastOp = '+';
  5. char[] arr = s.toCharArray();
  6. for (int i = 0; i < arr.length; i++) {
  7. if (arr[i]==' ') {
  8. continue;
  9. }
  10. if (Character.isDigit(arr[i])) {
  11. int tempNum = arr[i] - '0';
  12. i++;
  13. while (i< arr.length && Character.isDigit(arr[i])) {
  14. tempNum = tempNum * 10 + (arr[i] - '0');
  15. i++;
  16. }
  17. i--;
  18. if (lastOp == '+'){
  19. numStack.push(tempNum);
  20. }else if (lastOp == '-'){
  21. numStack.push(-tempNum);
  22. }else{
  23. numStack.push(res(lastOp, numStack.pop(), tempNum));
  24. }
  25. } else {
  26. lastOp = arr[i];
  27. }
  28. }
  29. int ans = 0;
  30. for (int num : numStack){
  31. ans += num;
  32. }
  33. return ans;
  34. }
  35. private int res(char op, int a, int b) {
  36. if (op == '*') {
  37. return a * b;
  38. }else{
  39. return a / b;
  40. }
  41. }
  42. }