[关闭]
@ysner 2021-10-20T10:51:46.000000Z 字数 2146 阅读 852

LeetCode772—基本计算器III

队列


第一次提交的代码:(栈+递归)

  1. class Solution {
  2. public int nw=0;
  3. public int calculate(String s)
  4. {
  5. return cal(s);
  6. }
  7. private int cal(String s)//自递归函数多用private
  8. {
  9. Stack<Integer> stack=new Stack<>();//泛型定义的new中不用再写一次泛型名
  10. int w=0;
  11. char op='+';
  12. for(;nw<s.length();nw++)
  13. {
  14. char c=s.charAt(nw);
  15. if(Character.isDigit(c)) w=w*10+c-'0';//高级的Character.isDigit()函数
  16. if(c=='(')//左括号标志着局部问题的开始,递归!
  17. {
  18. nw++;
  19. w=cal(s);
  20. }
  21. //当遇到了新的运算符,就要对上一个运算符op和累计的数字num作运算
  22. if((!Character.isDigit(c)&&c!=' ')||nw==s.length()-1)
  23. //空格直接无视;遇到字符串末尾,肯定是要结算的
  24. {
  25. int t=0;
  26. switch(op)
  27. {
  28. case '+':stack.push(w);break;
  29. case '-':stack.push(-w);break;
  30. case '*':t=stack.pop();stack.push(t*w);break;
  31. case '/':t=stack.pop();stack.push(t/w);break;
  32. }
  33. op=c;
  34. w=0;
  35. }
  36. if(c==')') break;//右括号标志着局部问题的结束,退出!
  37. }
  38. int ans=0;
  39. //结果汇总
  40. while(!stack.isEmpty())
  41. {
  42. ans+=stack.pop();
  43. }
  44. return ans;
  45. }
  46. }

第二次提交的代码:(栈+后缀表达式)

  1. class Solution {
  2. public String posts="";
  3. public int calculate(String s)
  4. {
  5. Trans(s);
  6. return getValue();
  7. }
  8. public void Trans(String s)//将中缀表达式转化为后缀表达式的函数
  9. {
  10. Stack<Character> stack=new Stack<>();
  11. int i=0,n=s.length();
  12. char ch;
  13. while(i<n)
  14. {
  15. ch=s.charAt(i);
  16. if(ch=='(') stack.push(ch);
  17. if(ch==')')
  18. {
  19. while(!stack.empty()&&stack.peek()!='(')
  20. {
  21. posts+=stack.pop();
  22. }
  23. stack.pop();//将(退栈
  24. }
  25. if(ch=='+'||ch=='-')
  26. {
  27. while(!stack.empty()&&stack.peek()!='(')
  28. {
  29. posts+=stack.pop();//将不低于ch的所有运算符退栈
  30. }
  31. stack.push(ch);
  32. }
  33. if(ch=='*'||ch=='/')
  34. {
  35. while(!stack.empty()&&stack.peek()!='('&&(stack.peek()=='*'||stack.peek()=='/'))
  36. {
  37. posts+=stack.pop();//将不低于ch的所有运算符退栈
  38. }
  39. stack.push(ch);
  40. }
  41. if(Character.isDigit(ch))//Character.isDigit()是判断ch是否为数字的内置函数
  42. {
  43. while(Character.isDigit(ch))//一次把数字读完
  44. {
  45. posts+=ch;
  46. i++;
  47. if(i<n) ch=s.charAt(i);
  48. else break;
  49. }
  50. i--;//前面i多右移了一位
  51. posts+='#';//标识着一个数字的结束(要不然两个数字会连在一次,被当成一个数字。。。)
  52. }
  53. i++;
  54. }
  55. while(!stack.empty())//最后记得把栈清空
  56. {
  57. posts+=stack.pop();
  58. }
  59. }
  60. public int getValue()//求后缀表达式的值
  61. {
  62. Stack<Integer> S=new Stack<>();
  63. int i=0,n=posts.length();
  64. int a,b;
  65. char ch;
  66. while(i<n)
  67. {
  68. ch=posts.charAt(i);
  69. switch(ch)
  70. {
  71. case '+':a=S.pop();b=S.pop();S.push(b+a);break;
  72. case '-':a=S.pop();b=S.pop();S.push(b-a);break;
  73. case '*':a=S.pop();b=S.pop();S.push(b*a);break;
  74. case '/':a=S.pop();b=S.pop();S.push(b/a);break;
  75. default:
  76. int w=0;
  77. while(Character.isDigit(ch))
  78. {
  79. w=w*10+ch-'0';
  80. i++;
  81. if(i<n) ch=posts.charAt(i);//读取数组元素时小心越界问题
  82. else break;
  83. }
  84. //由于有#,就不需要再回退了
  85. S.push(w);
  86. break;
  87. }
  88. i++;
  89. }
  90. return S.peek();
  91. }
  92. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注