Leetcode | Basic Calculator

来源:互联网 发布:karunesh 知乎 编辑:程序博客网 时间:2024/06/05 03:03

question

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

normal solution

没有优化 像利用栈进行四则运算的普通算法一样解决 效率其低
就是比较运算符的优先级 若在栈中的字符比要入栈的字符优先级高
将其提前出来 进行运算 循环

public String [][]priority = {    {">",">","=",">"},    {">",">","=",">"},    {"=","=","=","#"},    {"<","<","#"}};public int getIndex(String s){    switch (s)    {        case"+":            return 0;        case"-":            return 1;        case"(":            return 2;        case")":            return 3;    }    return 0;}public String cmp(String s1,String s2){    return priority[getIndex(s1)][getIndex(s2)];}public int calculate(String s) {    Stack<String> numbers = new Stack<String>();    Stack<String> signs = new Stack<String>();    int i=0;    int l=0;    int len=s.length();    char ch;    while(i < len)    {        ch=s.charAt(i);        //System.out.println("l i: "+l+" "+i);        if(Character.isDigit(ch))        {            while(Character.isDigit(ch))            {                i++;                if(i>=len)                    break;                ch=s.charAt(i);            }            if(i>l && i<=len)            {                String n=s.substring(l,i);                numbers.push(n);                System.out.println("number: "+n);            }            continue;        }else{            if(ch!=' ')            {            if(signs.isEmpty())            {                signs.push(ch+"");                System.out.println("sign: "+ch);            }else{                String top=signs.peek();                String cmpRe=cmp(top,ch+"");                if(cmpRe.equals(">"))                {                    int n1=0,n2=0;                    System.out.println("pop: "+numbers.peek());                    n2= Integer.valueOf(numbers.pop());                    //System.out.println("pop: "+numbers.peek());                    if(!numbers.isEmpty())                    n1= Integer.valueOf(numbers.pop());                    System.out.println("pop: "+signs.peek());                    String op=signs.pop();                    if(op.equals("+"))                    {                        numbers.push((n1+n2)+"");                    }else{                        numbers.push((n1-n2)+"");                    }                    System.out.println("number: "+numbers.peek());                    continue;                }else if(cmpRe.equals("#"))                {                    System.out.println("pop: "+signs.peek());                    signs.pop();                }else{                    signs.push(ch+"");                    System.out.println("sign: "+ch);                }            }        }            l=i+1;        }        i++;    }    while(!signs.isEmpty())    {        int n1=0,n2=0;        System.out.println("pop: "+numbers.peek());        n2= Integer.valueOf(numbers.pop());        //System.out.println("pop: "+numbers.peek());        if(!numbers.isEmpty())        n1= Integer.valueOf(numbers.pop());        System.out.println("pop: "+signs.peek());        String op=signs.pop();        if(op.equals("+"))        {            numbers.push((n1+n2)+"");        }else{            numbers.push((n1-n2)+"");        }    }    return Integer.valueOf(numbers.pop());}

excellent solution

一个运算符后必然有一个数字 用sign保存符号的(1 代表加号 0 代表减号) 用result变量保存每次运算的结果 遇到“(”时将符号位和数字入栈 因为遇到“(”时必然至多一个符号位和一个结果 遇到“)” 将遇到“(”时入栈的结果出栈 并将结果保存在result 最后的结果就是result。

真是excellent的解法

public static int calculate(String s) {int len = s.length(), sign = 1, result = 0;Stack<Integer> stack = new Stack<Integer>();for (int i = 0; i < len; i++) {    if (Character.isDigit(s.charAt(i))) {        int sum = s.charAt(i) - '0';        while (i + 1 < len && Character.isDigit(s.charAt(i + 1))) {            sum = sum * 10 + s.charAt(i + 1) - '0';            i++;        }        result += sum * sign;    } else if (s.charAt(i) == '+')        sign = 1;    else if (s.charAt(i) == '-')        sign = -1;    else if (s.charAt(i) == '(') {        stack.push(result);        stack.push(sign);        result = 0;        sign = 1;    } else if (s.charAt(i) == ')') {        result = result * stack.pop() + stack.pop();    }}return result;

}

0 0