Leetcode 224.基本计算器

基本计算器

实现一个基本的计算器来计算一个简单的字符串表达式的值。

字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格  。

示例 1:

输入: "1 + 1"

输出: 2

示例 2:

输入: " 2-1 + 2 "

输出: 3

示例 3:

输入: "(1+(4+5+2)-3)+(6+8)"

输出: 23

说明:

  • 你可以假设所给定的表达式都是有效的。
  • 不要使用内置的库函数 eval。

题目分析:最中规中矩的做法就是,先中缀表达式转后缀表达式,然后根据后缀表达式计算答案,Java跑了100ms,算是很慢了,中缀转后缀的方法是:

 

1.若为数字直接加到后面

 

2.若为'(',入符号栈

 

3.若为运算符,则将优先级大于等于它的运算符先弹出并记录带答案,再将其入栈,本题运算符只有+,-,优先级相同

 

4.若为')',弹出运算符直到遇到'('

 

因为可能存在不止1位的数字,所以用一个空格来区分,还有就是连字符串的时候StringBuffer要比String快得多

 1 import java.util.Stack;
 2 
 3 public class Solution {
 4 
 5     public static void solve(Stack<Integer> stkNum, char op) {
 6         int a = stkNum.peek();
 7         stkNum.pop();
 8         int b = stkNum.peek();
 9         stkNum.pop();
10         if(op == '+') {
11             stkNum.push(b + a);
12         }
13         else if(op == '-') {
14             stkNum.push(b - a);
15         }
16     }
17 
18     public static String infixToSuffix(String s) {
19         StringBuffer sb = new StringBuffer("");
20         Stack<Character> stkOp = new Stack<>();
21         int num, len = s.length();
22         for(int i = 0; i < len; i ++) {
23             char ch = s.charAt(i);
24             if(ch == ' ') {
25                 continue;
26             }
27             else if(ch == '(') {
28                 stkOp.push(ch);
29             }
30             else if(ch == '+' || ch == '-') {
31                 while(stkOp.size() > 0 && stkOp.peek() != '(') {
32                     sb.append(stkOp.peek());
33                     stkOp.pop();
34                 }
35                 stkOp.push(ch);
36             }
37             else if(ch == ')') {
38                 while(stkOp.peek() != '(') {
39                     sb.append(stkOp.peek());
40                     stkOp.pop();
41                 }
42                 stkOp.pop();
43             }
44             else {
45                 num = 0;
46                 while(i < len && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
47                     sb.append(s.charAt(i));
48                     i ++;
49                 }
50                 sb.append(' ');
51                 i --;
52             }
53         }
54         return sb.toString();
55     }
56 
57     public static int calculate(String s) {
58         Stack<Integer> stkNum = new Stack<>();
59         String str = infixToSuffix('(' + s + ')');
60         int num = 0;
61         //System.out.println("str = " + str);
62         for(int i = 0; i < str.length(); i ++) {
63             if(str.charAt(i) == '+') {
64                 solve(stkNum, '+');
65             }
66             else if(str.charAt(i) == '-') {
67                 solve(stkNum, '-');
68             }
69             else {
70                 num = 0;
71                 while(str.charAt(i) != ' ') {
72                     num = num * 10 + str.charAt(i) - '0';
73                     i ++;
74                 }
75                 stkNum.push(num);
76             }
77         }
78         return stkNum.peek();
79     }
80 
81     public static void main(String[] args){
82         calculate("23+45");
83     }
84 }

 

posted on 2018-12-31 19:26  kexinxin  阅读(221)  评论(0编辑  收藏  举报

导航