[leetcode]Basic Calculator(java)

原创 2015年07月07日 18:13:36

问题描述:
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.

通用算法是使用栈结构+后缀表达式(如代码1),但是看到csdn的一篇博客突然觉得这样好傻。因为这里面只有+和-,那么完全可以将()删除(代码2)。
这里面的思路是:使用一个栈,存放每个当前元素的系数(+1、-1),因为转变符号只有是-才会发生。

代码1:

 public int calculate(String s) {
         Stack<Character> charStack = new Stack<Character>();
         Stack<Integer> intStack = new Stack<Integer>();

         int index = -1;
         int length = s.length();
         char tmpChar;
         int top1,top2;
         while((++index)<length){
             if((tmpChar=s.charAt(index)) == ' ')//ignore blank
                 continue;
             switch (tmpChar) {
                case '(':
                    charStack.push(tmpChar);
                    break;
                case '-':
                case '+':
                    if(charStack.isEmpty())
                        charStack.push(tmpChar);
                    else if(charStack.peek()=='(')
                        charStack.push(tmpChar);
                    else {
                        char op = charStack.pop();
                        charStack.push(tmpChar);
                        switch (op) {
                            case '+':
                                top1 = intStack.pop();
                                top2 = intStack.pop();
                                intStack.push(top1+top2);
                                break;
                            default:
                                top1 = intStack.pop();
                                top2 = intStack.pop();
                                intStack.push(top2-top1);
                                break;
                        }
                    }
                    break;
                case ')':
                    while((tmpChar=charStack.pop())!='('){
                        switch (tmpChar) {
                        case '+':
                            top1 = intStack.pop();
                            top2 = intStack.pop();
                            intStack.push(top1+top2);
                            break;
                        case '-':
                            top1 = intStack.pop();
                            top2 = intStack.pop();
                            intStack.push(top2-top1);
                            break;
                        }
                    }
                    break;
                default://number
                    //form intnumber,and push to intstack
                    int number = 0;
                    while(tmpChar>='0'&&tmpChar<='9'){
                        number = number*10+tmpChar-'0';
                        if(++index<length)
                            tmpChar = s.charAt(index);
                        else
                            break;
                    }
                    intStack.push(number);
                    index--;
                    break;
                }
         }
         //process the last one
         while(!charStack.isEmpty()){
             tmpChar = charStack.pop();
             switch (tmpChar) {
                case '+':
                    top1 = intStack.pop();
                    top2 = intStack.pop();
                    intStack.push(top2+top1);
                    break;//+
                default:
                    top1 = intStack.pop();
                    top2 = intStack.pop();
                    intStack.push(top2-top1);
                    break;//-
            }
         }
         return (intStack.isEmpty())?0:intStack.pop();
      }

代码2:

 public int calculate(String s){
         int length = s.length();
         Stack<Integer> signStack  = new Stack<Integer>();
         signStack.push(1);//object
         signStack.push(1);//firstElement sign

         int index = -1;
         char tmpChar;
         int result = 0;

         while(++index<length){
             if((tmpChar=s.charAt(index))==' ')
                continue;//ignore blank
             switch (tmpChar) {
            case '+':
            case '(':
                signStack.push(signStack.peek());
                break;
            case '-':
                signStack.push(-1*(signStack.peek()));
                break;
            case ')':
                signStack.pop();
                break;
            default://digital
                int num=0;
                while(tmpChar>='0'&&tmpChar<='9'){
                    num=num*10+tmpChar-'0';
                    if(++index<length)
                        tmpChar = s.charAt(index);
                    else
                        break;
                }
                result+=signStack.pop()*num;
                index--;
                break;
            }
         }
         return result;
     }

LeetCode 227. Basic Calculator II 解题报告【python】

思路分析 该题是一个简单的表达式求值问题,我们可以采用“算符优先法”来解决该问题。该算法在严蔚敏的《数据结构C语言版》第三章有详细描述。 该题中的每一个表达式都是由操作数和操作符组成,根据四则运算法则...
  • kuaisuzhuceh
  • kuaisuzhuceh
  • 2016年01月30日 14:11
  • 568

Basic Calculator (非常重要)

227. Basic Calculator II Implement a basic calculator to evaluate a simple expression string. The...
  • gao1440156051
  • gao1440156051
  • 2016年08月13日 17:46
  • 215

【LeetCode】Basic Calculator && Basic Calculator II

1、Basic Calculator  Total Accepted: 3726 Total Submissions: 24053 My Submissions Question Solution  ...
  • u013027996
  • u013027996
  • 2015年06月24日 11:01
  • 3476

leetcode 227: Basic Calculator II

leetcode 227: Basic Calculator II PYTHON JAVA C++
  • xudli
  • xudli
  • 2015年06月26日 03:18
  • 6866

LeetCode Basic Calculator

LeetCode Basic Calculator题目思路其实就是前中后缀表达式的转换和计算; 以前写过一个类:前中后缀表达式计算类 但是由于类有点大,只能拆开交(为了检测正确性);代码转为前缀计...
  • u012925008
  • u012925008
  • 2015年06月13日 09:36
  • 1346

java calculate

  • 2014年07月22日 11:23
  • 19KB
  • 下载

Java Calculator

Java Calculator
  • xiaodong010203
  • xiaodong010203
  • 2016年10月19日 00:02
  • 217

杭电ACM 1012 u Calculate e java

u Calculate e Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To...
  • wangyang1354
  • wangyang1354
  • 2015年10月26日 10:43
  • 922

Basic Calculator (非常重要)

227. Basic Calculator II Implement a basic calculator to evaluate a simple expression string. The...
  • gao1440156051
  • gao1440156051
  • 2016年08月13日 17:46
  • 215

Beaver's Calculator 【归并排序+贪心】

问题描述   从万能词典来的聪明的海狸已经使我们惊讶了一次。他开发了一种新的计算器,他将此命名为"Beaver's Calculator 1.0"。它非常特别,并且被计划使用在各种各样的科学问题中。...
  • u014641529
  • u014641529
  • 2016年05月14日 11:13
  • 1039
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[leetcode]Basic Calculator(java)
举报原因:
原因补充:

(最多只允许输入30个字)