1. 程式人生 > >Leetcode 224.基本計算器

Leetcode 224.基本計算器

就是 字符串 -s sta else code ffi integer 假設

基本計算器

實現一個基本的計算器來計算一個簡單的字符串表達式的值。

字符串表達式可以包含左括號 ( ,右括號 ),加號 + ,減號 -,非負整數和空格 。

示例 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 }

Leetcode 224.基本計算器