基本计算器
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 。
示例 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 }