当前位置:   article > 正文

LeetCode 224. 基本计算器_基本计算器leetcode

基本计算器leetcode

224. 基本计算器

 

 

 

【双栈】nums用来存数,ops用来存符号。

1.预处理:把所有空格去掉,在前面加个‘0',防止出现 -1 + 2 这种样例。

2.遍历

(1)遇到 '(' 直接压入ops。

(2)遇到数字,通过 t * 10 + c - ‘0’ 直接计算出数值。

(3)遇到 ')' 把前面直到 '(' 的表达式算完,并把 '(' 丢掉。

(4)遇到 '+' 把前面直到  '(' 的表达式算完,'(' 不能丢;或者算到ops为空。

(5)遇到 '-',这种情况比较特殊,需要看一下前面是不是 '(' ,如果是的话往nums里插入一个0,防止这种不讲武德的样例 0 - ( - ( - 3 + 4) - 4)。

  1. class Solution {
  2. // 双栈 1:23 2:48
  3. public int calculate(String s) {
  4. Deque<Integer> nums = new LinkedList();
  5. Deque<Character> ops = new LinkedList();
  6. s = s.replace(" ", "");
  7. s = "0" + s;
  8. int n = s.length(), t = 0;
  9. int flag = 0;
  10. for (var i = 0; i < n; i++) {
  11. char c = s.charAt(i);
  12. if (c == ' ') continue;
  13. if (c == '(') {
  14. ops.push(c);
  15. } else if (c == ')') {
  16. if (flag != 0) {
  17. nums.push(t); t = 0;
  18. flag = 0;
  19. }
  20. while (!ops.isEmpty()) {
  21. char top = ops.poll();
  22. if (top == '(') break;
  23. else if (top == '+') {
  24. nums.push(nums.poll() + nums.poll());
  25. } else if (top == '-') {
  26. int tmp = nums.poll();
  27. nums.push(nums.poll() - tmp);
  28. }
  29. }
  30. // System.out.println(nums.peek());
  31. } else if (c == '+' || c == '-') {
  32. if (s.charAt(i - 1) == '(') {
  33. nums.push(0);
  34. ops.push('-'); continue;
  35. }
  36. if (flag != 0) {
  37. nums.push(t); t = 0;
  38. flag = 0;
  39. }
  40. while (!ops.isEmpty()) {
  41. char top = ops.poll();
  42. if (top == '(') {
  43. ops.push('('); break;
  44. } else if (top == '+') {
  45. nums.push(nums.poll() + nums.poll());
  46. } else if (top == '-') {
  47. int tmp = nums.poll();
  48. nums.push(nums.poll() - tmp);
  49. }
  50. }
  51. // System.out.println(nums.peek());
  52. ops.push(c);
  53. } else {
  54. t = t * 10 + c - '0';
  55. if (flag == 0) flag = 1;
  56. if (i == n - 1) {
  57. nums.push(t); t = 0;
  58. }
  59. }
  60. }
  61. while (!ops.isEmpty()) {
  62. char top = ops.poll();
  63. if (top == '+') {
  64. nums.push(nums.poll() + nums.poll());
  65. } else if (top == '-') {
  66. int tmp = nums.poll();
  67. if (nums.isEmpty()) {
  68. nums.push(-tmp);
  69. } else {
  70. nums.push(nums.poll() - tmp);
  71. }
  72. }
  73. }
  74. return nums.poll();
  75. }
  76. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/848231
推荐阅读
相关标签
  

闽ICP备14008679号