F_G

许多问题需要说清楚就可以&&走永远比跑来的重要

导航

[Leetcode] Basic Calculator

Basic Calculator

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .

You may assume that the given expression is always valid.

Some examples:

"1 + 1" = 2
" 2-1 + 2 " = 3
"(1+(4+5+2)-3)+(6+8)" = 23

Note: Do not use the eval built-in library function.

这个问题应该是比较亲切了!但是任然出现了超时问题,原因在于list的使用,list是使用链表实现的,随机存取效率不高,在这里当数据量比较大的时候,效率骤降,改用vector作为存储的基本单位。

代码如下:

 1 import java.util.*;
 2 
 3 public class Solution {
 4     //使用list效率应该是更低一些,在这里竟然会超时!!!!!!!!!!!
 5     //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 6     private Vector<String> getSeg(String s){
 7         s=s.trim();
 8         Vector<String> segment = new Vector<String>();
 9         int pre=0,i=0;
10         while(i<s.length()){
11             char c=s.charAt(i);
12             switch(c){
13                 case ' ':
14                     i++;
15                     break;
16                 case '(':
17                 case ')':
18                 case '+':
19                 case '-':
20                     segment.add(s.substring(i,i+1));
21                     i++;
22                     break;
23                 default:
24                     int endindex=i+1;
25                     while(endindex<s.length()&&Character.isDigit(s.charAt(endindex))){
26                         endindex++;
27                     }
28                     segment.add(s.substring(i,endindex));
29                     i=endindex;
30                     break;
31             }
32         }
33         return segment;
34     }
35     public int calculate(String s) {
36         Stack<Character> op = new Stack<Character>();
37         Stack<Integer> data = new Stack<Integer>();
38         Vector<String> segments = getSeg(s);
39         for(int i=0;i<segments.size();i++){
40             String seg = segments.get(i);
41             int opc = seg.charAt(0);
42             if(opc<='9'&&opc>='0'){
43                 data.push(Integer.parseInt(seg));
44             }else{
45                 switch(opc){
46                     case '(':
47                         op.push((char)opc);
48                         break;
49                     case '-':
50                     case '+':
51                         if(!op.isEmpty()&&op.peek()!='('){
52                             int data1 = data.pop();
53                             int data2 = data.pop();
54                             char opthis = op.pop();
55                             int resdata = 0;
56                             if(opthis=='+') resdata = data1 + data2;
57                             else resdata = data2 - data1;
58                             data.push(resdata);
59                         }
60                         op.push((char)opc);
61                         break;
62                     case ')':
63                         while(op.peek()!='('){
64                             int data1 = data.pop();
65                             int data2 = data.pop();
66                             char opthis = op.pop();
67                             int resdata = 0;
68                             if(opthis=='+') resdata = data1 + data2;
69                             else resdata = data2 - data1;
70                             data.push(resdata);
71                         }
72                         op.pop();
73                     break;
74                 }
75             }
76         }
77         while(!op.isEmpty()){
78             int data1 = data.pop();
79             int data2 = data.pop();
80             char opthis = op.pop();
81             int resdata = 0;
82             if(opthis=='+') resdata = data1 + data2;
83             else resdata = data2 - data1;
84             data.push(resdata);
85         }
86         return data.pop();
87     }
88 }

 

posted on 2015-08-31 19:56  F_G  阅读(143)  评论(0编辑  收藏  举报